Как перенаправить вложенную папку на запрос в Mod Rewrite для IIS 7.0?
Вопрос
Я использую Mod Rewrite для IIS 7.0 от iis.net и хочу перенаправлять запросы:
- http://example.com/users/фу Для http://example.com/User.aspx?имя=foo
- http://example.com/users/1 Для http://example.com/User.aspx?идентификатор=1
Я создал 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, но не в debug (URL, подобный http://localhost:9080/example.com/users/1 или .../пользователи/foo) и не работает в реальном IIS!
Что я сделал не так?
Решение
Очевидная проблема заключается в том, что ваши текущие регулярные выражения соответствуют только одному символу в имени пользователя или одному номеру.Вам нужно будет добавить квантификатор плюс внутри круглых скобок, чтобы сопоставить несколько букв или цифр.Видишь эта страница для получения дополнительной информации о кванторах регулярных выражений.Обратите внимание, что вы не будете сопоставлять простые 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 для устранения неполадок с правилами перезаписи.Это действительно упростило диагностику.Я смог сделать тестовый запрос и просмотреть трассировку, чтобы найти, где оценивается каждое правило перезаписи (оно находится в разделе трассировки под названием "PATTERN_MATCH".Что касается конкретного PATTERN_MATCH для одного из ваших правил, я видел это:
-СООТВЕТСТВИЕ ШАБЛОНУ
Шаблон /пользователи/([0-9]+?)
Пользователи InputURL/1
Отрицание ложного
Совпадающий false
Обратите внимание на отсутствие начальной косой черты.
Другие советы
Вы должны использовать <match url="/users/([0-9]+)" />
и <match url="/users/([a-z]+)" ignoreCase="true" />
, соответственно, чтобы соответствовать полному идентификатору пользователя, а не только его первой букве / цифре.Но я не знаю, почему ваше регулярное выражение завершилось ошибкой на одной цифре, так что, должно быть, есть и другая проблема.
Что касается вашего второго вопроса, я не уверен, что полностью понимаю.Как вы можете определить разницу между именем папки и именем пользователя?Всегда ли папка будет иметь завершающую косую черту?