IIS 7.5 Canonical URL重写多个域的规则

时间:2013-08-13 10:30:34

标签: asp.net url-rewriting iis-7.5 domain-name

IIS 7.5 网址重写2.0 的上下文中,我希望能够为多国网站强制执行多个域的规范域名,尽可能少的规则。像这样:

<rule name="UK Host Name">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^company\.co\.uk$" />
        <add input="{HTTP_HOST}" pattern="^company\.co$" />
        <add input="{HTTP_HOST}" pattern="^company\.org$" />
        <add input="{HTTP_HOST}" pattern="^company\.net$" />
        <add input="{HTTP_HOST}" pattern="^company\.uk\.com$" />
        <add input="{HTTP_HOST}" pattern="^www\.company\.co\.uk$" negate="true" />
    </conditions>
    <action type="Redirect" url="http://www.company.co.uk/{R:1}" />
</rule>
<rule name="France Host Name">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^company\.fr$" />
        <add input="{HTTP_HOST}" pattern="^company-france\.com$" />
        <add input="{HTTP_HOST}" pattern="^www\.company\.fr$" negate="true" />
    </conditions>
    <action type="Redirect" url="http://www.company.fr/{R:1}" />
</rule>

我认为,上述问题是每个条件都必须为logicalGrouping="MatchAll",但如果更改为MatchAny,则最后一个条件(negate="true")将为忽略,这意味着即使用户正在访问正确的域,我们也会运行重定向规则。

我能想到的唯一选择是为每个不同的域都有一个单独的重写规则,但是可能存在大量的域并且它可能会变得混乱。将会有大量其他重写规则和地图。

如何制作更复杂的条件,而不仅仅是全部或任何?

1 个答案:

答案 0 :(得分:7)

诀窍是将您要匹配的域与or |运算符组合成一个规则,这样您只有一个'正面'规则和一个“负面”规则应该MatchAll 。 E.g:

<rule name="UK Host Name">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^company\.(co(\.uk)?|org|net|uk\.com)$" />
        <add input="{HTTP_HOST}" pattern="^www\.company\.co\.uk$" negate="true" />
    </conditions>
    <action type="Redirect" url="http://www.company.co.uk/{R:1}" />
</rule>
<rule name="France Host Name">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^company(-france)?\.(fr|com)$" />
        <add input="{HTTP_HOST}" pattern="^www\.company\.fr$" negate="true" />
    </conditions>
    <action type="Redirect" url="http://www.company.fr/{R:1}" />
</rule>

这最终可能会使您的正则表达式与太多域名匹配的可能性很小。例如。模式pattern="^company(-france)?\.(fr|com)$"也匹配company.com,这可能是不可取的。在这种情况下,你必须更具体,例如将模式更改为pattern="^company\.fr|company-france\.com$"