如何解决Response.Redirect 将绝对 URL 转换为相对 URL
我有一个 asp.net 网站 (.net 4.7.2),它使用 Response.Redirect 重定向到一些外部资源。例如。 https://mypage.com/link?id=1
次调用
HttpContext.Current.Response.Redirect("https://anotherpage.com/article.html",false);
HttpContext.Current.ApplicationInstance.CompleteRequest();
该网站在多个环境(服务器)上运行,并且在其中一些环境中重定向工作正常,但在某些情况下,附加到响应的 Location
标头已损坏 - 其值为 https://mypage.com/article.html
。所以最终 URL 是当前主机名与重定向 URL 的相对路径的组合。我不明白为什么会这样。
我尝试像这样设置标题 - 这没有什么区别:
HttpContext.Current.Response.StatusCode = 302;
HttpContext.Current.response.addheader("Location",redirectLink);
我想避免任何客户端黑客行为,例如呈现 javascript 重定向代码。
我的问题与此类似:Response.Redirect() is dealing an Absolute URL as an relative URL 但我没有使用任何自定义协议,而是重定向到简单且格式正确的 URL。
再说明一点:实际上这段代码在过去几年里一直有效,似乎是在安装最新的四月 Windows 更新(Windows Server 2016、kb5001347、kb5001402、kb5001649)后出现的 - 但令人惊讶的是在恢复这些更新后这个问题仍然出现这些受影响的环境。
解决方法
结果证明它与 IIS 或 asp.net 应用程序无关。我没有在问题中提到该网站在 ARR 后面运行。事实证明,ARR 设置在环境之间不同步。当设置 reverseRewriteHostInResponseHeaders 设置为 true 时,主机名将替换为 ARR。要在 ARR 中禁用此设置:
打开 %WINDIR%\system32\inetsrv\config\applicationHost.config
并应用:
<system.webServer>
...
<proxy enabled="true" reverseRewriteHostInResponseHeaders="false" />
...
</system.webServer>
或通过 inetmgr.exe 中的 ARR GUI:
我在修复此问题后发现的另一个相关主题:https://serverfault.com/questions/807012/iis-rewriting-location-header-before-arr
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。