IIS URL重写规则不适用于整个站点

时间:2018-10-08 15:55:51

标签: asp.net iis url-redirection rules

我的目标是将以下URL转发到新站点(由于我在oldsite.com/test.aspx中有其他规则,因此需要完全匹配):

  • oldsite.com
  • oldsite.com /
  • www.oldsite.com
  • www.oldsite.com /
  • 只有上面(静态)的那些我不希望转发例如oldsite.com/test.aspx

我使用的是:

<rule name="Redirect" stopProcessing="true">
                    <match url="oldsite.com$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{HTTP_HOST}" pattern="oldsite.com" />
                        <add input="{HTTP_HOST}" pattern="www.oldsite.com" />
                        <add input="{HTTP_HOST}" pattern="oldsite.com/" />
                        <add input="{HTTP_HOST}" pattern="www.oldsite.com/" />
                    </conditions>
                    <action type="Redirect" url="http://newsite.com" appendQueryString="false" />
                </rule>

我的规则无效,我想知道为什么

1 个答案:

答案 0 :(得分:1)

HTTP主机标头从不包含/,因此以{HTTP_HOST}结尾的/条件是多余的。

另一方面,

<match url="oldsite.com$"仅表示仅与以oldsite.com结尾的路径(而不是URL)匹配。

例如:

  • http://whatever/something-oldsite.com匹配。
  • http://whatever/oldsite.com匹配。
  • http://whatever/oldsite.comA不匹配。
  • http://whatever/oldsite.co不匹配。

显然这不是您想要的。

此外,请记住,文字点字符(.)在正则表达式中表示“与任何字符匹配”。这意外地导致您的模式与例如http://whatever/oldsiteZcom之类的URL进行匹配匹配。查找文字点时,请记住要在图案中使用反斜杠转义点。

这里的url元素的<match>属性有点模棱两可,我一直想知道为什么Microsoft选择这个名称,例如<match path="..这样的名称会更清楚,但这就是我们所拥有的URL重写模块。我了解您的困惑,我在那里。

无论如何,您正在寻找确切的空路径,因此需要如下规则。

<rule name="Redirect" stopProcessing="true">
    <match url="^$" ignoreCase="false" /> <!-- path is empty, just starts (^) and ends ($), does not contain anything -->
    <conditions>
        <add input="{HTTP_HOST}" pattern="^oldsite\.com$" /> <!-- host name literally equals to oldsite.com -->
        <add input="{HTTP_HOST}" pattern="^www\.oldsite\.com$" /> <!-- host name literally equals to www.oldsite.com -->
    </conditions>
    <action type="Redirect" url="http://newsite.com" appendQueryString="false" />
</rule>

希望有帮助。