Правило перезаписи URL-адресов IIS с параметрами

Мне трудно заставить работать правило перезаписи URL.

Я хочу этот URL:

http://www.mysite.com/oldpage.aspx?oldid=123

Чтобы переписать на:

http://www.mysite.com/sub/newpage.aspx?newid=123

Вот что у меня есть, но не работает:

<rule name="Old2New" stopProcessing="true">
    <match url="^oldpage.aspx?oldid=([0-9]+)" />
    <action type="Rewrite" 
            url="/sub/newpage.aspx?newid={R:1}" 
            appendQueryString="true"  />
</rule>

Что мне не хватает?


person Dan LaRiviere    schedule 04.02.2011    source источник
comment
Какую версию ASP.NET вы используете? Существует огромная разница между .NET 4 и предыдущими версиями (откровенно говоря, в предыдущих версиях переписывание URL-адресов было отстойным).   -  person pearcewg    schedule 05.02.2011
comment
@percewg - на самом деле UrlRewrite является функцией/расширением IIS и на самом деле не имеет ничего общего с используемой версией ASP.NET. Я думаю, вы ошибочно принимаете это за различные bodges, которые вам приходилось делать в IIS6 (сопоставление подстановочных знаков, httpmodules и т. д.), если у вас не было надлежащего переписчика на основе ISAPI, такого как ISAPI_Rewrite или Iconic Rewriter.   -  person Kev    schedule 05.02.2011
comment
Я сузил проблему до вопросительного знака. Если я убегу от него, изменив matchURL на ^oldpage.aspx\?oldid=([0-9]+), тестовое совпадение будет работать, но запросы через IIS не будут перезаписываться.   -  person Dan LaRiviere    schedule 08.02.2011


Ответы (2)


Индекс регулярного выражения начинается с 0, а не с 1, поэтому ваше правило должно быть таким:

<rule name="Old2New" stopProcessing="true">
    <match url="^oldpage.aspx?oldid=([0-9]+)" />
    <action type="Rewrite" 
            url="/sub/newpage.aspx?newid={R:0}" 
            appendQueryString="true"  />
</rule>

Вы можете легко проверить свое правило в интерфейсе IIS7.

person Victor    schedule 05.02.2011
comment
На самом деле {R:0} возвращает oldpage.aspx?oldid=123, а {R:1} возвращает 123. Похоже, проблема связана со знаком вопроса. - person Dan LaRiviere; 08.02.2011

Используйте условия, чтобы поймать часть строки запроса {C:1}, например:

<rule name="My rule" stopProcessing="true">
    <match url="^oldpage\.aspx" ignoreCase="true" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{QUERY_STRING}" pattern="oldid=([0-9]+)" />
    </conditions>
    <action type="Redirect" url="/sub/newpage.aspx?newid={C:1}" appendQueryString="false" />
</rule>

Проверено и работает.

person Ralpharama    schedule 26.10.2017