首页 > 解决方案 > 重定向响应总是重定向到同一个域

问题描述

我正在编写一套 ASP.NET Core Web 应用程序,这些应用程序有时必须相互重定向。在本地测试时,一切正常。然而,当我在我们的登台服务器上发布它们时,重定向总是“停留”在同一个主机上。例如,如果我打开http://app1.test/并重定向到http://app2.test/somepath,我在LocationHTTP 标头 i中实际得到的内容http://app1.test/somepath:我指定的任何 URL 都会被转换,以便它“保留”在当前主机名中。

然而,这不会在本地发生。我已将应用程序部署为 Kestrel 进程,并且它们通过 IIS 公开,用作反向代理。这可能是原因吗?我应该怎么做才能解决这个问题?

更新

这是反向代理的完整 web.config app1.test

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:5000/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
    <system.web>
        <sessionState mode="InProc" />
        <customErrors mode="RemoteOnly" />
    </system.web>
</configuration>

app2.test的 web.config 几乎相同(当然,除了端口号)。

更新 2

我会尽力解释得更好。我注意到目标站点并不重要,所以我会让事情变得更简单:我的应用程序中有一个操作,我想将用户重定向到 Google。这是Home控制器中的操作:

public IActionResult ToGoogle()
{
    return Redirect("https://www.google.com?q=Hi");
}

如果我在本地启动网络应用程序并请求http://localhost:1234/Home/ToGoogle,一切都很好:响应是 302 Found,Location标头中有正确的 URL(www.google.com 等)。

一旦我将应用程序发布到登台服务器(端口 5000 上的 Kestrel 应用程序,在具有上面发布的重写规则的 IIS 反向代理后面),就会发生以下情况:

响应重定向到不在我的应用程序域之外的 URL,此处以蓝色覆盖,而不是应有的 www.google.com。

这是什么原因?

标签: asp.net-core

解决方案


我自己找到了解决方案。这确实是反向代理的问题。

IIS 可以选择在响应标头中重写主机。该答案中描述了该解决方案(如果您的 IIS 或 Windows Server 版本不是指定的版本,则该问题的其他答案中有附录)。


推荐阅读