Переписать карты в 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 приписывать.

Другие вопросы по тегам