IIS已禁用重写规则仍生效 新配置重定向不触发问题排查
异常重定向触发原因
- 核心原因是你当前编写的URL重写规则存在多处语法错误,整个rewrite配置节点无法被IIS解析加载,节点内的
<clear />指令、所有自定义规则全部不生效,IIS直接执行上层继承的旧重定向规则:- 所有
<match>、<action>节点的url属性被错写为l - HTTPS跳转规则内的服务器变量
{REQUEST_URI}被错写为{REQUEST_I} - 所有精确匹配规则的匹配值错误携带了协议和域名,IIS重写模块的匹配范围仅为域名后的请求路径,不会匹配协议、域名部分,就算属性名正确,这类规则也永远无法命中
- 存在两条完全重复的5e路径跳转规则,属于无效冗余配置
- 所有
- 你之前配置的整站跳转规则没有保存在当前站点的web.config中,而是保存在IIS层级配置的上层位置:IIS配置采用逐层继承机制,全局配置(
applicationHost.config)、父级站点/应用的web.config中配置的规则会自动被子级站点继承,当前站点配置无效时就会直接执行上层规则。 - 301永久重定向存在强缓存特性:浏览器会长期缓存301响应结果,哪怕后端规则已经修改,本地缓存未清除时也会直接按照旧缓存跳转,干扰排查结果。
排查解决步骤
- 首先修复重写规则的语法错误,替换成正确的配置内容,注意规则顺序:精确路径的跳转规则放在前面,通用的根路径、其余路径跳转规则放在后面,避免被通用规则提前拦截:
<rewrite> <rules> <clear /> <!-- HTTPS跳转规则 --> <rule name="Redirect to https" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" /> </rule> <!-- 精确路径跳转规则 --> <rule name="5e path redirect" enabled="true" patternSyntax="ExactMatch" stopProcessing="true"> <match url="5e/" /> <action type="Redirect" url="https://www.b.com/products/5/" logRewrittenUrl="false" /> </rule> <rule name="10e path redirect" enabled="false" patternSyntax="ExactMatch" stopProcessing="true"> <match url="10e/" /> <action type="Redirect" url="https://www.b.com/products/10/" logRewrittenUrl="true" /> </rule> <rule name="16e path redirect" enabled="false" patternSyntax="ExactMatch" stopProcessing="true"> <match url="16e/" /> <action type="Redirect" url="https://www.b.com/products/16/" logRewrittenUrl="true" /> </rule> <rule name="3e path redirect" enabled="false" patternSyntax="ExactMatch" stopProcessing="true"> <match url="3e/" /> <action type="Redirect" url="https://www.b.com/products/3/" logRewrittenUrl="true" /> </rule> <!-- 根路径跳转至目标站首页 --> <rule name="root redirect" enabled="true" stopProcessing="true"> <match url="^$" /> <action type="Redirect" url="https://www.b.com/" redirectType="Permanent" /> </rule> <!-- 其余子路径同路径跳转 --> <rule name="remaining path redirect" enabled="true" stopProcessing="true"> <match url="(.*)" /> <action type="Redirect" url="https://www.b.com/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite>
- 排查上层继承的旧规则:打开IIS管理器,先选中服务器根节点,进入「URL重写」面板查看是否存在旧的整站跳转规则,存在则直接删除;再逐级选中站点所属的父级应用、目录节点检查重写规则,确认旧规则位置后清理即可。配置正确的情况下,当前站点规则内的
<clear />指令会直接阻断所有上层规则的继承,不需要额外修改上层配置也能让旧规则失效。 - 清理缓存验证结果:测试时打开Chrome开发者工具,在网络面板勾选「Disable cache」选项后再访问,避免浏览器本地301缓存影响;如果站点前接了CDN、反向代理,需要同步清理代理节点的缓存。也可以在服务器本地执行curl命令直接回源测试,绕过所有缓存环节确认IIS返回的重定向结果是否符合预期:
curl -I -H "Host: shop.a.com" http://127.0.0.1/5e/
内容的提问来源于stack exchange,提问作者I am not Fat
相关产品推荐
相关产品推荐

