IIS下Response.Redirect跳转域名异常,求排查原因
嘿,我碰到过好几个类似的问题,你这种情况大概率是IIS层面的某些配置拦截并修改了跳转的目标地址,下面给你梳理几个最可能的原因和对应的IIS设置检查点:
URL重写模块的规则干扰
这是最常见的元凶。如果你的IIS装了URL Rewrite模块,一定要去检查对应站点的「URL重写」规则:- 看看有没有入站规则在强制把外部域名替换成你的
originaldomain,比如规则匹配了所有跳转请求,然后用原域名覆盖目标域名; - 重点检查出站规则,因为
Response.Redirect本质是返回302状态码,同时在响应头的Location字段里指定跳转地址,出站规则很可能悄悄修改了这个字段的值,把外部域名换成了原域名。
你可以打开IIS管理器,找到站点的「URL重写」功能,逐个查看规则的匹配条件和执行操作,尤其是涉及域名替换、路径改写的规则。
- 看看有没有入站规则在强制把外部域名替换成你的
应用程序请求路由(ARR)的代理设置
如果你的站点用了ARR做反向代理或者负载均衡,ARR有个默认设置会改写响应头里的主机地址。比如「Reverse rewrite host in response headers」这个选项,一旦开启,它会把响应里的外部主机名替换成ARR代理的原域名,直接导致你的跳转地址被篡改。
你可以在IIS的服务器节点找到「Application Request Routing Cache」,进入「服务器代理设置」,看看这个选项是否被勾选,临时关闭后测试一下跳转是否正常。自定义HTTP模块/站点拦截逻辑
虽然你问的是IIS设置,但有些时候站点部署的自定义HTTP模块(或者ASP.NET的中间件)会拦截Response.Redirect的调用,修改目标URL。比如有些安全模块会限制跳转到外部域名,自动把外部URL替换成内部域名的路径。你可以检查站点的web.config里有没有注册自定义模块,或者有没有相关的安全配置项。快速排除:确认URL变量的完整性
虽然你说url变量是完整的外部地址,但还是可以快速确认一下代码里的url是否真的包含了完整的https://someotherdomainotherthanmine——比如有没有不小心漏掉协议或者域名,导致变成相对路径(不过根据你的描述,这个可能性不大,但排查成本很低)。
内容的提问来源于stack exchange,提问作者Alexander Matusiak

