IIS跨域URL Rewrite失效问题(ASP.NET站点)
问题诊断与解决方案
核心问题
已部署ARR并规避IIS URL Rewrite常见错误,静态HTML站点的同域/跨域重写规则均正常生效,但带母版页的ASP.NET站点跨域重写失效:访问http://testsite1/About时,FRT日志显示URL先被重写至http://testsite2/About,随后又被还原为原URL,最终返回原站点内容。
原因分析
ASP.NET的UrlRoutingModule路由模块或母版页的页面生命周期逻辑,会在ARR重写操作之后的请求管道阶段,重新解析并修改请求URL,覆盖ARR的重写结果:
- 带母版页的ASP.NET页面会触发路由解析、页面初始化等流程,若站点配置了Web Forms或MVC路由规则,路由模块会基于原请求上下文重置URL路径。
- ARR重写默认发生在请求管道早期阶段(如PreBeginRequest),而ASP.NET路由模块在后续阶段(如PostResolveRequestCache)执行,导致重写结果被覆盖。
解决步骤
1. 调整ARR重写规则的执行顺序
确保跨域重写规则在ASP.NET路由模块之后执行:
- 打开IIS管理器,进入
testsite1的URL重写规则界面,选中目标跨域规则,点击右侧「上移」提升优先级(确保在所有ASP.NET路由规则之后)。 - 或直接在
web.config中修改规则的order属性,设置为更大数值:
<rule name="CrossDomainRewrite" stopProcessing="true" order="100"> <match url="^About$" /> <action type="Rewrite" url="http://testsite2/About" /> </rule>
2. 禁用不必要的ASP.NET路由模块
若testsite1无需路由功能,在web.config中移除路由模块:
<system.webServer> <modules> <remove name="UrlRoutingModule-4.0" /> </modules> </system.webServer>
3. 添加路由忽略规则(需保留路由时)
若必须保留站点路由,让目标路径跳过ASP.NET路由解析:
在Global.asax的Application_Start方法中添加:
protected void Application_Start(object sender, EventArgs e) { // 忽略/About路径的路由解析 RouteTable.Routes.IgnoreRoute("About"); // 其他路由注册逻辑... }
4. 检查ARR代理配置
确认ARR代理功能正确启用,避免反向代理的URL还原逻辑干扰:
- 打开IIS管理器的「Application Request Routing Cache」面板,勾选「Enable proxy」。
- 进入「Proxy Settings」,取消勾选「Reverse rewrite host in response headers」(无需修改响应头时),避免影响重写后的URL上下文。
5. 定位FRT日志中的重置模块
查看FRT日志中URL还原记录的ModuleName字段:
- 若为
UrlRoutingModule-4.0,对应上述路由模块问题;若为其他ASP.NET模块,需针对性调整该模块的执行顺序或配置。
内容的提问来源于stack exchange,提问作者Jey
相关产品推荐
相关产品推荐

