我想使用 IIS 7.5 中的 URL 重写模块来重定向所有请求不是从特定子域(x.domain.com)到特定文件夹/文件。
例如,这些应该按原样工作:
x.domain.com
x.domain.com/asdf
尽管有以下这些:
y.domain.com
y.domain.com/asdf
domain.com
domain.com/asdf
应重定向到这样的特定页面(确切的 URL,不依赖于使用的子域):
domain.com/a
不幸的是,我无法正确配置规则,因为虽然它匹配正确,但大多数情况下,当它匹配时只会导致重定向循环。(我知道我现在应该设置错误的规则,但它们甚至不会持续导致重定向循环。)
在 IIS 中设置另一个与 www.domain.com 和 domain.com 匹配的网站是简单的解决方案,但我更希望有一个可以处理所有事情并进行重定向的网站。
什么是正确的设置来获得这种行为(使用 UI 或直接将其添加到 Web.config)。
谢谢!
答案1
由于您尚未发布现有规则(导致重定向循环的规则),我无法告诉您为什么它不起作用。但我可以告诉您什么应该起作用:
<rule name="Rewrite all but one subdomain" stopProcessing="true">
<match url="domain.com" />
<conditions logicalGrouping="matchAll">
<add input="{HTTP_HOST}" negate="true" pattern="^x.domain\.com$" />
<add input="{HTTP_HOST}" negate="true" pattern="^domain\.com$" />
</conditions>
<action type="Redirect" url="http://domain.com/a/" appendQueryString="false" />
</rule>
<rule name="Rewrite domain requests" stopProcessing="true">
<match url="domain.com" />
<conditions logicalGrouping="matchAll">
<add input="{HTTP_HOST}" pattern="^domain\.com$" />
<add input="{PATH_INFO}" pattern="^/a/$" negate="true" />
</conditions>
<action type="Redirect" url="http://domain.com/a/" appendQueryString="false" />
</rule>
这里我们必须有规则,一个是重写所有 URL 匹配的请求,domain.com
除了主机头完全匹配之外x.domain.com
(domain.com
以避免循环)。
第二条规则匹配对domain.com
以下地址的请求/a/
:
答案2
Mathias 的回答满足了我的需求。我必须遵循的确切规则如下,仅涉及两处更改:
匹配 URL 实际上是基于路径的,所以我必须将其更改为匹配任何内容(或不匹配任何内容),这很好,因为 IIS 在网站上正确设置了绑定并且条件将正确捕获它。
logicalGrouping 的枚举需要是 MatchAll。
<rule name="Rewrite all but one subdomain" enabled="true" stopProcessing="true">
<match url=".?" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^x.domain\.com$" negate="true" />
<add input="{HTTP_HOST}" pattern="^domain\.com$" negate="true" />
</conditions>
<action type="Redirect" url="http://domain.com/a/" appendQueryString="false" />
</rule>
<rule name="Rewrite domain requests" stopProcessing="true">
<match url=".?" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^domain\.com$" />
<add input="{PATH_INFO}" pattern="^/a/$" negate="true" />
</conditions>
<action type="Redirect" url="http://domain.com/a/" appendQueryString="false" />
</rule>