Как перенаправить вложенную папку на запрос в Mod Rewrite для IIS 7.0?

StackOverflow https://stackoverflow.com/questions/632360

  •  08-07-2019
  •  | 
  •  

Вопрос

Я использую 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, но не в 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" />, соответственно, чтобы соответствовать полному идентификатору пользователя, а не только его первой букве / цифре.Но я не знаю, почему ваше регулярное выражение завершилось ошибкой на одной цифре, так что, должно быть, есть и другая проблема.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top