2012-04-11 2 views
1

Я экспериментировал с Backbone для проекта, над которым я работаю, и у меня возникли проблемы с тем, как работает «pushState» Backbone, как бы я хотел.HTML5 PushState Regex Issue

У меня есть простой проект, состоящий из 4 видов и маршрутизатора. Я прохожу через id элементов, если это имеет значение в этом случае. Когда я перехожу к хэшу для одного из видов (http://example.com/backbonetest/ # step1), он отображается правильно, а URL-адрес изменен. Это то, что я ожидаю здесь, но проблема возникает, когда я пытаюсь перейти к одной и той же вещи без хеша в ней (http://example.com/backbonetest/ step1). Я получаю 404 на сервере (IIS), которого следует ожидать, поскольку страница не существует.

То, что я пытался делать весь день, это написать выражение регулярных выражений для IIS, которое будет захватывать и переписывать URL-адрес, удаляя фрагмент в конце URL-адреса, чтобы страница была правильно подана. Я предпочел бы просто переписать URL-адрес, чем иметь физический файл с тем же именем, поскольку содержимое страницы будет динамически генерироваться и потребует от скриптов получить контент в любом случае.

Проблема, с которой я столкнулся, может быть связана с тем, как мне нужно иметь папки/скрипты/стили, структурированные в файловой системе. Я надеялся иметь весь пример, содержащийся в папке /backbonetest/. Для скриптов, «backbonetest/scripts» и так далее.

Я сделал список URL-адресов, которые я тестировал свои регулярные выражения выражения против, и результаты, которые я пытался добиться:

 
    Input:     Output: 

    2      
    a2      
    ab2      
    ab22      
    step2     
    script.js    script.js 
    scripts/    scripts/ 
    555/stuff    555/stuff 
    scripts/script.js  scripts/script.js 

Edit: Я с тех пор нашел, что url, который используется, не включает предыдущую косую черту, , поэтому решение Qtax не работает в IIS. Новая структура ввода показана выше.

Код «/ 555/stuff», который я ожидал бы до 404, как обычно. Я только хочу переписать url, если нет подкаталогов, отличных от текущего, и если url не ссылается на явный файл (например, с расширением).

Я весь день чистил сетку для решения этого вопроса, а также экспериментировал с regexr, но не смог найти правильное решение моей проблемы. Не найдя нигде нигде, я думаю, что я должен смотреть на это неправильно ...

Может ли кто-нибудь помочь мне, пожалуйста?

+0

не знает IIS, но регулярное выражение перепишет вы можете использовать это '^/[^ /. ] + $ 'to'/'. – Qtax

+0

Это отлично работает с моими тестовыми данными и с тестером в диспетчере IIS, но по какой-либо причине URL-адреса либо не пойманы должным образом, либо они были переписаны неправильно. – brins0

+0

Я узнал, что вход, который я дал здесь, не совсем то, что использует IIS для правил перезаписи, объясняя, почему он не работает. Что мне нужно изменить в предложенном выражении Qtax, чтобы заставить его работать для новой строки ввода? – brins0

ответ

2

После долгих ударов по голове/стол, я придумал решение. Это раздражающе просто для всей суеты, это вызвано:

^[^\./]+$

По существу:

Заменить, если URL не содержит «/» или «» где угодно.

Это должно быть решением для всех, кто использует IIS с базовым и HTML5 нажатием. Просто поместите его в web.config в корень вашего приложения и измените действие перезаписи на «.», И оно должно просто работать.

1

Это растаяло мой мозг все утро!

Я добавил к этому - в моем сценарии у меня есть проект API, который находится в виртуальном каталоге API (чтобы исключить необходимость в CORS) - я, очевидно, не хочу переписывать любые вызовы PAI, поэтому я переписал мой следующим образом - вы можете сделать то же для API URL, если это необходимо ...

 <rule name="Handle PushState"> 
     <match url="^[^\./]+[^\./api]+(.*)$" /> 
     <conditions> 
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     </conditions> 
     <action type="Rewrite" url="." /> 
     </rule>