在 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"
)将为忽略,这意味着即使用户正在访问正确的域,我们也会运行重定向规则。
我能想到的唯一选择是为每个不同的域都有一个单独的重写规则,但是可能存在大量的域并且它可能会变得混乱。将会有大量其他重写规则和地图。
如何制作更复杂的条件,而不仅仅是全部或任何?
答案 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$"
。