.Net Framework WebForms用URL重写模块拦截外部重定向配置问题
IIS 拦截外部开放重定向的URL重写规则配置
你当前编写的入站规则存在逻辑偏差:入站规则仅能处理客户端发起的请求,无法拦截应用程序返回给客户端的3xx重定向响应,要实现外部重定向拦截必须使用出站重写规则,直接匹配响应头中存储重定向目标的Location字段,再做域名合法性校验。
核心配置逻辑
- 仅匹配
http:///https://开头的绝对路径重定向,自动放行站内常用的相对路径重定向(如/account/login这类无域名的跳转,本身属于站内合法操作) - 从绝对路径重定向地址中提取域名部分,和当前请求的服务端变量
{HTTP_HOST}做比对,域名不一致则判定为外部重定向,执行拦截动作 - 拦截动作可按需选择重定向回本站首页,或直接返回403禁止状态
完整可用配置
将以下规则添加到Web.config的<system.webServer><rewrite><outboundRules>节点下即可:
<rule name="Block External Redirects" stopProcessing="true"> <!-- 匹配响应头中的Location重定向目标字段 --> <match serverVariable="RESPONSE_Location" pattern="^https?://([^/]+)/?(.*)" /> <conditions> <!-- 判断提取到的重定向目标域名 和 当前站点域名不一致 --> <add input="{R:1}" pattern="{HTTP_HOST}" negate="true" /> </conditions> <!-- 命中规则后动作:重定向回本站首页,可按需替换为返回403 --> <action type="Redirect" url="https://{HTTP_HOST}/" appendQueryString="false" redirectType="Temporary" /> </rule>
配置注意事项
- 需提前在IIS中安装官方URL Rewrite模块,否则规则不会生效
- 如果站点绑定了多个合法域名(如同时存在
example.com和www.example.com的跳转需求),可调整条件部分的匹配规则,把所有合法域名加入白名单即可,避免合法跨域名跳转被误拦截 - 不建议使用301永久重定向作为拦截动作,测试阶段用302临时重定向,确认规则逻辑无误后再调整状态码,避免浏览器缓存导致的访问异常
内容的提问来源于stack exchange,提问作者Rushabh Dharia
相关产品推荐
相关产品推荐

