Response.Redirect 将绝对值 URL 转换为相对值

Response.Redirect converts absolute URL to relative

我有一个 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 header 被破坏 - 它的值为 https://mypage.com/article.html.所以最后的 URL 是当前主机名与 reidrect 的相对路径 URL 的组合。我不明白为什么会这样。

我试过这样设置 header - 这没有什么区别:

HttpContext.Current.Response.StatusCode = 302;
HttpContext.Current.Response.AddHeader("Location", redirectLink);

我想避免任何 client-side 黑客攻击,例如渲染 javascript 重定向代码。

我的问题与这个类似:Response.Redirect() is dealing an Absolute URL as an relative URL 但我没有使用任何自定义协议,我正在重定向到简单、格式正确的 URLs.

还有一点要注意:实际上这段代码在过去几年里一直有效,而且似乎是在安装最新的 4 月 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