Как перенаправить подпапку на запрос в Mod Rewrite для IIS 7.0? - PullRequest
0 голосов
/ 11 марта 2009

Я использую Mod Rewrite для IIS 7.0 с iis.net и хочу перенаправить запросы:

Я создал 2 правила:

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

Он проходит тестирование в диалоговом окне теста iis mmc, но не в режиме отладки (URL-адрес типа http://localhost:9080/example.com/users/1 или … / users / foo ) и не работает в режиме реального времени. IIS!

Что я сделал не так?

Ответы [ 2 ]

2 голосов
/ 06 марта 2010

Очевидная проблема заключается в том, что ваши текущие регулярные выражения соответствуют только одному символу в имени пользователя или одному номеру. Вам нужно будет добавить плюсик в скобках, чтобы соответствовать нескольким буквам или цифрам. См. эту страницу для получения дополнительной информации о квантификаторах регулярных выражений. Обратите внимание, что вы не будете соответствовать простым URL-адресам, таким как "/ users /" (без идентификатора или имени). Убедитесь, что это то, что вы хотели.

Другая проблема, с которой вы столкнулись, заключается в том, что IIS оценивает правила перезаписи, начиная с первого символа после начального слеша. Таким образом, ваше правило для соответствия /users/([0-9]) не будет ничего совпадать, потому что когда происходит оценка регулярного выражения, URL выглядит как users/foo, а не /users/foo. Решение состоит в том, чтобы использовать ^ (который является символом регулярного выражения, что означает "начало строки") в начале шаблона вместо косой черты. Как это:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

Обратите внимание, что вы выбираете Users.aspx для одного из этих URL-адресов и User.aspx (без множественного числа) для другого. Убедитесь, что это то, что вы хотели.

Кстати, я понял, что с помощью IIS Failed Request Tracing для устранения проблем правил перезаписи . Это сделало диагностику действительно простой. Мне удалось сделать тестовый запрос и просмотреть трассировку, чтобы найти, где оценивается каждое правило перезаписи (оно находится в разделе трассы, называемом «PATTERN_MATCH». Для конкретного PATTERN_MATCH для одного из ваших правил я увидел следующее:

-PATTERN_MATCH
Шаблон / пользователи / ([0-9] +?)
Пользователи InputURL / 1
Отрицание ложное
Совпадение ложно

Обратите внимание на отсутствие начального слеша.

1 голос
/ 06 марта 2010

Вы должны использовать <match url="/users/([0-9]+)" /> и <match url="/users/([a-z]+)" ignoreCase="true" /> соответственно, чтобы соответствовать полному идентификатору / пользователю, а не только их первой букве / цифре. Но я не знаю, почему ваше регулярное выражение потерпело неудачу с одной цифрой, поэтому должна быть и другая проблема.

Что касается вашего второго вопроса, я не уверен, что полностью понимаю. Как вы можете определить разницу между именем папки и именем пользователя? Будет ли папка всегда иметь косую черту?

...