【问题标题】:How does Kestrel know the virtual directory it is running under in IIS?Kestrel 如何知道它在 IIS 中运行的虚拟目录?
【发布时间】:2017-08-07 12:48:34
【问题描述】:

我们正在尝试使用 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 完整路径以及我如何复制该行为?

【问题讨论】:

  • 很可能是环境变量。

标签: c# amazon-web-services iis kestrel


【解决方案1】:

每当 asp.net 运行时重定向时,它将始终使用基本路径 从根。在你的情况下,问题是〜通过了。这说明 浏览器从 / 的基本路径重定向。

您可以删除 ~ 并尝试提供 Redirect("Web/Login")。但我看到 asp.net 运行时总是将带有位置标头的 Reidrect 响应添加为 "~/Web/Login"。

所以如果去掉~不起作用,你可以试试

Response.RedirectToAbsoluteUrl("Web/Login");

编辑:

解释为什么在你做反向代理时会发生这种情况

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

www.example.com => servername:8080 

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

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

看起来像这样

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)。这会导致 Location 标头出现问题发送响应(如果有 ~,这会导致原始 URL 中的相对路径出现问题。

希望这会有所帮助!

【讨论】:

  • 当 IIS 管理 Kestrel 工作进程时,代码工作正常,所以我认为这不是我们重定向方式的问题。只有当我们手动运行 Kestrel 并在其中有反向代理路由连接时才会出现问题,这就是为什么我相信我们可以使用配置值来传递基本路径。
  • 是的,我怀疑相对路径,因为通常设置反向代理的方式。添加了更多细节,请仔细检查
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
相关资源
最近更新 更多