asp.net-core - 重定向响应总是重定向到同一个域
问题描述
我正在编写一套 ASP.NET Core Web 应用程序,这些应用程序有时必须相互重定向。在本地测试时,一切正常。然而,当我在我们的登台服务器上发布它们时,重定向总是“停留”在同一个主机上。例如,如果我打开http://app1.test/
并重定向到http://app2.test/somepath
,我在Location
HTTP 标头 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 反向代理后面),就会发生以下情况:
这是什么原因?
解决方案
我自己找到了解决方案。这确实是反向代理的问题。
IIS 可以选择在响应标头中重写主机。该答案中描述了该解决方案(如果您的 IIS 或 Windows Server 版本不是指定的版本,则该问题的其他答案中有附录)。
推荐阅读
- unity3d - Sync between GameObject and Entity in ECS
- sass - 0.625rem 不是有效的 CSS 值
- nodes - Hyperledger cost of peers for an organization
- java - 使用oracle函数时如何在mybatis中将参数作为CLOB传递?
- javascript - Can't find application.js with javascript_pack_tag(Webpacker)
- angular - angular json schema form remove selected options from select options
- perl - 网络上的官方 Perl 文档是什么?
- java - How to use @Id of one @Entity in another @Entity in a @OneToOne relationship in Hibernate
- c# - How to use multiple PUT fuctions in Web api C#
- javascript - Making server-side rendered content interactive on the client (SSR + Client-Side JS)