重定向响应始终重定向到同一域

时间:2018-12-17 10:21:16

标签: asp.net-core

我正在编写一套ASP.NET Core Web应用程序,有时不得不相互重定向。在本地测试时,一切正常。但是,当我在暂存服务器上发布它们时,重定向始终“停留”在同一主机中。例如,如果我在http://app1.test/上并重定向到http://app2.test/somepath,则实际上我在Location HTTP标头i http://app1.test/somepath中得到的内容:我指定的任何URL都会进行转换,以便它当前主机名中的“ stays”。

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

更新

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

<?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");
}

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

一旦我将应用程序发布到登台服务器(端口5000上的Kestrel应用程序,位于上面发布了重写规则的IIS反向代理之后),就会发生这种情况:

The response redirects to an URL that is not outside my app's domain, covered in blue here, rather than to www.google.com as it should.

这是什么原因?

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。反向代理确实存在问题。

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