簡體   English   中英

Kestrel如何知道它在IIS中運行的虛擬目錄?

[英]How does Kestrel know the virtual directory it is running under in IIS?

我們正在嘗試使用ECS和API網關將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完整路徑以及如何復制該行為?

每當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響應

看起來像這樣

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中的相對路徑出現問題。

希望這可以幫助!。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM