IIS URL 重写规则不适用于整个站点
IIS URL rewriting rule not working for entire site
我的目标是将以下 URL 转发到新站点(需要精确匹配,因为我对旧站点有其他规则。com/test.aspx):
- oldsite.com
- oldsite.com/
- www.oldsite.com
- www.oldsite.com/
- 只有上面的(静态)我不想转发旧站点。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>
我的规则不起作用,我想知道为什么
HTTP 主机 header 从不包含 /
,因此您的 {HTTP_HOST}
以 /
结尾的条件是多余的。
另一方面,<match url="oldsite.com$"
只是意味着只匹配以 oldsite.com
.
结尾的路径(而不是 URLs)
例如:
http://whatever/something-oldsite.com
匹配。
http://whatever/oldsite.com
匹配。
http://whatever/oldsite.comA
不匹配。
http://whatever/oldsite.co
不匹配。
显然这不是你想要的。
此外,请记住文字点字符 (.
) 在正则表达式中表示 "match with any character"。这会意外地导致您的模式与 URL 相匹配,例如 http://whatever/oldsiteZcom
。请记住在查找文字点时在模式中使用反斜杠转义点。
<match>
元素的 url
属性在这里有点模棱两可,我一直想知道微软为什么选择这个名字,像 <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>
希望对您有所帮助。
我的目标是将以下 URL 转发到新站点(需要精确匹配,因为我对旧站点有其他规则。com/test.aspx):
- oldsite.com
- oldsite.com/
- www.oldsite.com
- www.oldsite.com/
- 只有上面的(静态)我不想转发旧站点。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>
我的规则不起作用,我想知道为什么
HTTP 主机 header 从不包含 /
,因此您的 {HTTP_HOST}
以 /
结尾的条件是多余的。
<match url="oldsite.com$"
只是意味着只匹配以 oldsite.com
.
例如:
http://whatever/something-oldsite.com
匹配。http://whatever/oldsite.com
匹配。http://whatever/oldsite.comA
不匹配。http://whatever/oldsite.co
不匹配。
显然这不是你想要的。
此外,请记住文字点字符 (.
) 在正则表达式中表示 "match with any character"。这会意外地导致您的模式与 URL 相匹配,例如 http://whatever/oldsiteZcom
。请记住在查找文字点时在模式中使用反斜杠转义点。
<match>
元素的 url
属性在这里有点模棱两可,我一直想知道微软为什么选择这个名字,像 <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>
希望对您有所帮助。