我们正在尝试使用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完整路径以及如何复制该行为?
答案 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中相对路径出现问题。
希望这会有所帮助!