IIS中URL重写正则表达式问题:特定域名匹配失效
IIS URL重写匹配特定域名前缀的解决方案
你的问题出在对IIS URL重写模块的匹配范围理解有误:默认情况下,Match URL中的正则表达式仅作用于请求的路径部分(即域名后的/anyfolder/anyfile这类内容),不会包含协议(http/https)和域名本身,所以直接写^http(s)?://subdomain.maindomain.com(.*)自然无法匹配。
正确的配置方式需要结合服务器变量来判断域名,具体步骤如下:
1. 添加匹配域名的条件
在URL重写规则的Conditions区域,添加以下条件:
- 条件输入:
{HTTP_HOST} - 检查输入字符串是否匹配正则表达式:
^subdomain\.maindomain\.com$
(注意:点号.在正则里是通配符,必须用反斜杠\转义)
如果需要限定仅匹配HTTPS请求,可以再添加一个条件:
- 条件输入:
{HTTPS} - 检查输入字符串是否等于:
on
2. 配置路径匹配规则
在Match URL区域,设置正则表达式为^(.*),这样就能匹配该域名下的任意路径内容。
3. 完整规则示例(XML格式)
如果直接在web.config中配置,规则代码如下:
<rewrite> <rules> <rule name="Match Specific Domain Prefix" stopProcessing="true"> <match url="^(.*)$" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTP_HOST}" pattern="^subdomain\.maindomain\.com$" /> <add input="{HTTPS}" pattern="on" /> <!-- 可选,仅限定HTTPS --> </conditions> <action type="Rewrite" url="https://subdomain.maindomain.com/{R:1}" appendQueryString="true" /> </rule> </rules> </rewrite>
{R:1}对应Match URL中(.*)捕获的路径内容appendQueryString="true"会自动保留原查询参数(比如param1=1¶m2=2)
关键说明
- 不要试图在
Match URL的正则里包含协议和域名,这部分逻辑必须通过Conditions中的服务器变量来实现 - 若需要匹配带www或不带www的域名,可以调整
{HTTP_HOST}的正则,比如^(www\.)?subdomain\.maindomain\.com$
内容的提问来源于stack exchange,提问作者Frank Martin
相关产品推荐
相关产品推荐

