Переписать карты в 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 Map Regex?, в котором упоминаются регулярные выражения, использовать нельзя (цитата из Использование карт перезаписи в модуле перезаписи URL), но, как я там прокомментировал, это, похоже, относится к конкретным примерам, приведенным перед этим текстом, а не к массовому «это никогда не сработает».

Что мне не хватает? Должны быть какие-то средства для этого; я пропустил что-то очевидное?


person Owen Blacker    schedule 24.03.2014    source источник


Ответы (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} во вводе условия

Я разделяю ваш опыт в поиске достойной документации; Мне пришлось поэкспериментировать с помощью следующих статей:

person Ruud Helderman    schedule 26.03.2014
comment
Идеально. Спасибо! :) - person Owen Blacker; 27.03.2014

Во-первых, не используйте точку, она соответствует всем и, естественно, является жадной. Вместо этого используйте отрицание символа: ([^\n]+). Попробуйте это, затем запустите повторно, и если это не сработает, попробуйте снова добавить /? к атрибуту pattern.

person Jamie Howarth    schedule 26.03.2014
comment
Во всех примерах используется точка, fwiw. Мой вопрос заключается в том, какие регулярные выражения мы вообще можем использовать? — если я устанавливаю pattern в ([^\n]+/?) или ([^\n]+/?) и удаляю карту перезаписи с помощью key="/buy/", то передача www.foo.com/buy работает, но www.foo.com/buy/ все равно 404s. Извините, нет сигары для Бена :) - person Owen Blacker; 26.03.2014