IIS Rewrite规则异常:URL自动移除test/前缀致访问故障
问题分析与解决方案
你的问题核心在于出站规则没有处理后端返回的Location响应头,同时现有HTML标签重写规则的匹配逻辑也存在疏漏,导致浏览器地址栏里的test/前缀被意外移除。
具体问题点
- 当后端服务(比如Mantis登录跳转)返回
Location: /mantis/login_page.php这类重定向响应头时,你的现有规则没有对这个头进行重写,浏览器会直接跳转到不带test/的URL。 - 现有
AddPrefix规则的匹配模式没有精准覆盖所有路径场景,替换逻辑可能导致前缀丢失。
修正后的完整配置
<rules> <rule name="ToMonceau" stopProcessing="true"> <match url="test/(.*)" /> <action type="Rewrite" url="http://10.5.5.83/{R:1}" /> <serverVariables> <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> <set name="HTTP_ACCEPT_ENCODING" value="" /> </serverVariables> </rule> </rules> <outboundRules> <!-- 处理HTML中的资源链接(A/Img/Link/Script) --> <rule name="RewriteHTMLLinks" preCondition="IsText" enabled="true"> <match filterByTags="A, Img, Link, Script" pattern="^/(mantis/.*)" /> <conditions> <add input="{URL}" pattern="^/test/mantis/.*" /> </conditions> <action type="Rewrite" value="/test/{R:1}" /> </rule> <!-- 处理后端返回的Location重定向头 --> <rule name="RewriteLocationHeader" preCondition="IsRedirect" enabled="true"> <match serverVariable="RESPONSE_Location" pattern="^http://10.5.5.83/(.*)" /> <action type="Rewrite" value="/test/{R:1}" /> </rule> <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding"> <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" /> <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" /> </rule> <preConditions> <preCondition name="IsText"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/(.+)" /> </preCondition> <preCondition name="NeedsRestoringAcceptEncoding"> <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".*" /> </preCondition> <!-- 新增:匹配重定向响应状态码 --> <preCondition name="IsRedirect"> <add input="{RESPONSE_STATUS}" pattern="3(0[12378])" /> </preCondition> </preConditions> </outboundRules>
关键修改说明
添加
RewriteLocationHeader规则:- 专门处理后端返回的
Location响应头,把后端返回的http://10.5.5.83/mantis/xxx重写为/test/mantis/xxx,确保浏览器跳转到带test/前缀的URL。 - 新增
IsRedirect预条件,只针对301/302/303/307/308这类重定向状态码生效,避免不必要的处理。
- 专门处理后端返回的
优化
RewriteHTMLLinks规则(原AddPrefix):- 简化匹配模式,直接匹配以
/mantis/开头的路径,替换为/test/mantis/xxx,逻辑更清晰,避免原规则中分组导致的前缀丢失问题。 - 条件判断更精准,只在当前请求URL是
/test/mantis/开头时才触发重写。
- 简化匹配模式,直接匹配以
给入站规则添加
stopProcessing="true":- 确保匹配到
test/(.*)后不再处理后续的入站规则,避免冲突。
- 确保匹配到
额外注意事项
- 确保你的IIS服务器已经安装了URL Rewrite模块和**Application Request Routing (ARR)**组件,ARR需要启用代理功能(在IIS管理器的服务器节点下,找到ARR,点击"Server Proxy Settings",勾选"Enable proxy")。
- 如果后端服务返回的是相对路径(比如
/mantis/xxx而不是完整URL),可以调整RewriteLocationHeader的匹配模式为^/(mantis/.*),对应替换值为/test/{R:1}。
内容的提问来源于stack exchange,提问作者Stéphane Delarue
相关产品推荐
相关产品推荐

