Двунаправленная перезапись / перенаправление URL в IIS7.5 - PullRequest
1 голос
/ 19 мая 2010

Прежде всего, я хотел бы извиниться за нелепое название. Я не пытаюсь звучать круто или умно, используя слово «двунаправленный», я просто искренне не мог придумать другой способ описать его. Promise.

По моей проблеме. У меня есть следующее в разделе <system.webserver> / <rewrite> / <rules> моего Web.config.

<!-- Who We Are -->
<rule name="1A">
    <match url="^whoweare\.aspx$" />
    <action type="Redirect" url="who-we-are" redirectType="Permanent" />
</rule>
<rule name="1B">
    <match url="^who-we-are$" />
    <action type="Rewrite" url="whoweare.aspx" />
</rule>

<!-- What We Do -->
<rule name="2A">
    <match url="^whatwedo\.aspx$" />
    <action type="Redirect" url="what-we-do" redirectType="Permanent" />
</rule>
<rule name="2B">
    <match url="^what-we-do$" />
    <action type="Rewrite" url="whatwedo.aspx" />
</rule>

Теперь это работает потрясающе. Фактически, если вы посетите URL http://example.com/whoweare.aspx (который является фактическим URL страницы), вы будете перенаправлены на URL http://example.com/who-we-are () Виртуальный URL), и если вы посетите виртуальный URL, вы будете перезаписаны в фактический URL.

Это означает суперсекретные URL-адреса без дублирования, и это также не приводит к взаимному переписыванию, поэтому улыбается со всех сторон.

У меня такой вопрос: можно ли сделать это более элегантно?

Немного обременительно писать два правила, чтобы гарантировать, что одно перенаправлено на другое, а другое переписано на другое. Можно ли написать одно правило, которое будет достигать функциональности вышеупомянутых двух?

1 Ответ

2 голосов
/ 20 мая 2010

Elegance - это субъективный термин, я думаю, что есть несколько способов, которые были бы лучше, например, использование расширяемости Rewrite и реализация логики причудливого отображения, но я рекомендую использовать только 2 правила, один для Redirect. и один для Rewrite, и с этим просто используйте Rewrite Maps, который сделает его более читабельным (но все же болезненным) для управления ими, например, ниже вам теперь нужно будет только поддерживать карты и больше не иметь дело с правилами:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="Rewrite From Pretty URL" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{URLsToRewrite:{REQUEST_URI}}" pattern="(.+)" />
                </conditions>
                <action type="Rewrite" url="{C:1}" appendQueryString="false" />
            </rule>
            <rule name="Redirect To Pretty URL" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{URLsToRedirect:{REQUEST_URI}}" pattern="(.+)" />
                </conditions>
                <action type="Redirect" url="{C:1}" appendQueryString="false" />
            </rule>
        </rules>
        <rewriteMaps>
            <rewriteMap name="URLsToRewrite">
                <add key="/who-we-are" value="/whoweare.aspx" />
                <add key="/what-we-do" value="/whatwedo.aspx" />
            </rewriteMap>
            <rewriteMap name="URLsToRedirect">
                <add key="/whoweare.aspx" value="/who-we-are" />
                <add key="/whatwedo.aspx" value="/what-we-do" />
            </rewriteMap>
        </rewriteMaps>
    </rewrite>
</system.webServer>
...