0

我们正在尝试使用 ECS 和 API Gateway 将我们的 aspnetcore Web 应用程序从我们自己的 Windows/IIS 服务器迁移到 AWS。我们一切正常,但在我们的 Web 应用程序中遇到了一个意想不到的重定向问题。我们的网站在 IIS 中是这样设置的:

/ => the root website is pointing to another web app
/app1 => app1 is setup as a virtual directory pointing to an empty folder
/app1/v1 => v1 is setup as an application pointing to an aspnetcore app
/app2/v1 => again v1 is setup as an application pointing to a different aspnetcore app

我有一个非常简单的开箱即用的 aspnetcore 应用程序,它被设置为 /app1/v1 下的虚拟目录。aspnetcore 应用程序中的路由是:

/Web
/Web/Login
/Web/Home

当用户首次访问该站点 ( http://localhost/app1/v1/Web ) 时,他们将使用以下命令重定向到登录页面:

Redirect("~/Web/Login")

当应用程序由 IIS 运行时,导致浏览器被重定向到:

http://localhost/app1/v1/Web/Login

但是,当我使用反向代理(如 AWS API Gateway)时,该代理已使用重定向到的相同虚拟路径进行设置:

http://localhost/Web/Login

我猜在启动期间必须有一个配置值需要传递给 Kestrel,或者作为请求标头告诉它添加“/app1/v1/”到它执行的任何 ~/ 重定向?有谁知道 IIS 如何告诉 Kestrel 完整路径以及我如何复制该行为?

4

1 回答 1

1

每当 asp.net 运行时重定向时,它将始终使用来自根目录的基本路径。在您的情况下,问题已通过。这告诉浏览器从 / 的基本路径重定向。

您可以删除 ~ 并尝试提供 Redirect("Web/Login")。但是我已经看到 asp.net 运行时总是将带有 Location Header 的 Reidrect Response 添加为“~/Web/Login”。

因此,如果删除 ~ 不起作用,您可以尝试使用

Response.RedirectToAbsoluteUrl("Web/Login");

编辑:

解释为什么在您进行反向代理时可能会发生这种情况

通常你设置一个像这样的反向代理

www.example.com => servername:8080 

当代理转发请求时,server(asp.net) 不知道 www.example.com 的任何信息,对于该 asp.net 运行时请求主机名是 servername。

现在,当您进行重定向时,asp.net 运行时发送的是302 响应

这看起来像这样

Client request:

GET /app1/v1/Webl HTTP/1.1
Host: localhost
Server response:

HTTP/1.1 302 Found
Location: ~/Web/Login

如果您想确认,请与提琴手一起检查

现在,当你在一个反向代理后面时,你可能有这样的设置

www.example.com/myapp => servername:8080 

 www.example.com/anotherapp => servername2:8080

您可以仔细检查反向代理设置的方式。现在想象相同的 302 响应,但您的应用程序不知道相对路径是什么(www.example.com/myapp)。这会导致在响应(如果有 ~,这会导致原始 URL 中的相对路径出现问题。

希望这可以帮助!。

于 2017-08-05T18:28:18.633 回答