ASP.NET4.7+IIS10添加REWRITE规则出现ERR_TOO_MANY_REDIRECTS问题
解决IIS Rewrite规则引发的ERR_TOO_MANY_REDIRECTS问题
问题本质
你使用Rewrite(服务器内部重写)而非Redirect(外部重定向)时,指定绝对URL(https://oldsite.com/pageA)会让IIS将请求作为反向代理转发到oldsite。如果oldsite的pageA存在跳转规则(比如HTTPS强制跳转、www域名跳转,或是业务逻辑跳回newsite),且转发请求的Host头默认仍为newsite.com,就会触发oldsite的跳转逻辑,最终形成循环。而Redirect是直接告知浏览器跳转,地址栏更新为oldsite的URL,不会涉及内部转发,因此不会出现循环。
修复方案
方案1:调整Rewrite规则,配置反向代理Host头
若必须保留Rewrite(维持浏览器地址栏不变),需修改规则添加服务器变量配置,确保转发到oldsite的请求使用正确的Host头:
<rule name="testrewrite" stopProcessing="true"> <match url="page1$" /> <conditions> <add input="{HTTP_HOST}" pattern="^(www\.)?newsite\.com$" /> </conditions> <action type="Rewrite" url="https://oldsite.com/pageA" /> <serverVariables> <set name="HTTP_HOST" value="oldsite.com" /> </serverVariables> </rule>
同时在IIS中允许修改HTTP_HOST变量:
- 打开站点的URL重写模块
- 点击右侧「查看服务器变量」
- 添加
HTTP_HOST并勾选「允许修改」
方案2:改用Redirect规则(更简单,无需隐藏地址场景)
如果不需要保持地址栏为newsite.com,直接使用已验证可行的Redirect规则:
<rule name="testredirect" stopProcessing="true"> <match url="page1$" /> <conditions> <add input="{HTTP_HOST}" pattern="^(www\.)?newsite\.com$" /> </conditions> <action type="Redirect" url="https://oldsite.com/pageA" redirectType="Permanent" /> </rule>
redirectType="Permanent"对应301永久重定向,利于SEO;临时跳转可改用Temporary(302)。
方案3:排查oldsite的跳转逻辑
确认oldsite.com的pageA是否存在跳回newsite的规则,包括:
- IIS重定向规则
- ASP.NET页面中的
Response.Redirect代码 - HTML的
<meta http-equiv="refresh">跳转 - CDN或域名服务商的跳转配置
若存在此类逻辑,需调整规则排除来自newsite的转发请求。
批量配置page1/page2规则
可以通过正则匹配+重写映射批量处理两个页面,提升规则效率:
<rewriteMaps> <rewriteMap name="OldPageMap"> <add key="page1" value="pageA" /> <add key="page2" value="pageB" /> </rewriteMap> </rewriteMaps> <rule name="RewriteToOldSitePages" stopProcessing="true"> <match url="^(page1|page2)$" /> <conditions> <add input="{HTTP_HOST}" pattern="^(www\.)?newsite\.com$" /> </conditions> <action type="Rewrite" url="https://oldsite.com/{OldPageMap:{R:1}}" /> </rule>
内容的提问来源于stack exchange,提问作者user1581715
相关产品推荐
相关产品推荐

