Kestrel如何知道它在IIS中运行的虚拟目录?

时间:2017-08-04 20:10:05

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

我们正在尝试使用ECS和API网关将我们的aspnetcore网络应用程序从我们自己的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完整路径以及如何复制该行为?

1 个答案:

答案 0 :(得分:1)

  

每当asp.net运行时重定向时,它将始终使用基本路径   来自根。在你的情况下问题是〜传递。这是告诉   浏览器从基本路径重定向是/.

你可以删除〜并尝试使用Redirect(“Web / Login”)。但是我看到asp.net运行时总是添加Reidrect Response并将位置标题添加为“〜/ Web / Login”。

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

Response.RedirectToAbsoluteUrl("Web/Login");

修改

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

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

www.example.com => servername:8080 

当代理转发请求时,服务器(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)。这导致了什么位置标题是问题发送响应(如果它有〜,这会导致原始URL中相对路径出现问题。

希望这会有所帮助!