如何为特定域名限制IIS Rewrite Map的作用范围
如何为特定域名限制IIS Rewrite Map的作用范围?
我明白你的困扰——把Rewrite Map规则限定到单个域名确实容易踩正则匹配的坑。你之前的配置问题主要出在HTTP_HOST的匹配模式不够精确,以及规则的逻辑判断上。咱们一步步来修复:
核心问题分析
你之前用的.*www.abc.com.*这种模式太宽松了,它会匹配任何包含www.abc.com字符串的域名(比如xxxwww.abc.comyyy这种奇怪的域名),而且有些配置里错误地把域名放到了match url里(url匹配的是路径部分,不是域名),导致规则意外应用到所有域名。
正确的配置方案
下面是只针对www.abc.com生效的Rewrite Map配置,我会详细标注关键点:
<rewrite> <!-- 规则部分:先判断域名,再匹配Rewrite Map中的路径 --> <rules> <rule name="ABC Redirects" enabled="true" stopProcessing="true"> <!-- match url匹配所有路径,因为我们靠Rewrite Map来筛选具体路径 --> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <!-- 精确匹配域名:用^和$限定开头结尾,转义.(正则里.代表任意字符) --> <add input="{HTTP_HOST}" pattern="^www\.abc\.com$" /> <!-- 检查当前请求路径是否在ABCRedirects这个Rewrite Map中有对应的条目 --> <add input="{ABCRedirects:{REQUEST_URI}}" pattern="(.+)" /> </conditions> <!-- 重定向到Rewrite Map中对应的目标路径 --> <action type="Redirect" url="{C:1}" appendQueryString="false" /> </rule> </rules> <!-- 引入外部Rewrite Map文件(如果你的映射是放在单独文件里的话) --> <rewriteMaps configSource="abc-rewritemaps.config" /> </rewrite>
对应的abc-rewritemaps.config内容保持你原来的就行:
<rewriteMaps> <rewriteMap name="ABCRedirects"> <add key="/legal" value="/privacy" /> <add key="/good" value="/bad" /> <add key="/hi" value="/bye" /> <add key="/no" value="/not" /> <add key="/123" value="/321" /> </rewriteMap> </rewriteMaps>
关键细节说明
- 精确匹配域名:
^www\.abc\.com$这个正则确保只有完全等于www.abc.com的域名才会触发规则,避免误匹配其他相似域名。 - 逻辑分组:
logicalGrouping="MatchAll"(默认就是这个值,可省略)要求两个条件都满足:域名正确,且当前路径在Rewrite Map中有对应条目,这样规则才会执行。 - stopProcessing="true":确保这个规则匹配后,不会再处理后续的其他重写/重定向规则,提高效率也避免冲突。
- REQUEST_URI的使用:
{REQUEST_URI}会获取包含开头/的完整路径,和你Rewrite Map里的key格式完全匹配,保证映射准确。
测试验证
配置完成后,你可以测试:
- 访问
www.abc.com/legal,应该会跳转到www.abc.com/privacy - 访问
www.xyz.com/legal或者www.eee.com/legal,应该不会有任何重定向,保持原路径访问
这样就能完美实现只对www.abc.com应用Rewrite Map的重定向规则了。
内容的提问来源于stack exchange,提问作者Andi AR
相关产品推荐
相关产品推荐

