我正在编写一套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反向代理之后),就会发生这种情况:
这是什么原因?
答案 0 :(得分:0)
我自己找到了解决方案。反向代理确实存在问题。
IIS具有在响应标头中重写主机的选项。 this answer中描述了该解决方案(如果您指定的IIS或Windows Server版本不是该版本,则在同一问题的其他答案中也有附录)。