Переписать карты в IIS7 - как сделать так, чтобы совпадение включало косую черту?
Я прочитал 30 лучших хитов Google для нескольких комбинаций IIS rewrite map condition
и так далее, но я не могу найти приличную документацию, ни на сайте microsoft.com, ни где-либо еще.
У меня есть куча карт перезаписи в IIS7, которые я хотел бы обработать независимо от того, сопровождаются ли они косой чертой. Так www.foo.com/bar
а также www.foo.com/bar/
оба должны соответствовать правилу.
<rewrite>
<rewriteMaps>
<rewriteMap name="ShortURLs">
<add key="/terms" value="/en-us/terms-and-conditions/"/>
<add key="/privacy" value="/en-us/privacy-and-cookies/"/>
<add key="/buy" value="/en-us/where-to-buy/"/>
</rewriteMap>
</rewriteMaps>
<rules>
<rule name="Short URL redirects">
<match url="^/?(.+)/?$" />
<conditions>
<add input="{ShortURLs:{REQUEST_URI}}" pattern="(.+)"/>
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="true"/>
</rule>
</rules>
</rewrite>
Теперь это работает очень хорошо, за исключением того, что я могу найти единственный способ сделать /terms/
Соответствие первому ключу в карте перезаписи означает дублирование карты, так что она гласит:
<rewriteMap name="ShortURLs">
<add key="/terms" value="/en-us/terms-and-conditions/"/>
<add key="/privacy" value="/en-us/privacy-and-cookies/"/>
<add key="/buy" value="/en-us/where-to-buy/"/>
<add key="/terms/" value="/en-us/terms-and-conditions/"/>
<add key="/privacy/" value="/en-us/privacy-and-cookies/"/>
<add key="/buy/" value="/en-us/where-to-buy/"/>
</rewriteMap>
Это кажется нелепо нелегким, учитывая, что я использую регулярные выражения, чтобы соответствовать им в первую очередь. Добавление /?
на вход условия или шаблон условия, кажется, не работает.
Я видел ответ на IIS7 Переписать карту Regex? упоминание о том, что регулярные выражения не могут быть использованы (цитата из " Использование переписанных карт в модуле перезаписи URL"), но, как я уже там прокомментировал, это, похоже, относится к конкретным примерам, приведенным перед этим текстом, а не к оптовому "это никогда не сработает",
Что мне не хватает? Должны быть какие-то средства сделать это; я что-то упускаю очевидное?
2 ответа
Это должно сделать это:
<rewrite>
<rewriteMaps>
<rewriteMap name="ShortURLs">
<add key="terms" value="/en-us/terms-and-conditions/"/>
<add key="privacy" value="/en-us/privacy-and-cookies/"/>
<add key="buy" value="/en-us/where-to-buy/"/>
</rewriteMap>
</rewriteMaps>
<rules>
<rule name="Short URL redirects">
<match url="^(.+?)/?$" />
<conditions>
<add input="{ShortURLs:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="true"/>
</rule>
</rules>
</rewrite>
Вы были довольно близко; Мне нужно было только сделать три небольших изменения:
- убраны начальные косые черты в ключах на карте перезаписи
- использовал не жадный квантификатор
+?
в матче правила - использовал обратную ссылку на матч
{R:1}
в условии ввода
Я делюсь вашим опытом в поиске достойной документации; Мне пришлось экспериментировать с помощью следующих статей:
Во-первых, не используйте точку, она соответствует всему и естественно жадная. Вместо этого используйте отрицание символа: ([^\n]+)
, Попробуйте это, затем повторите, и если это не работает, попробуйте добавить /?
снова на pattern
приписывать.