當網頁應用程式前面用了 Nginx 來做反向代理的時候,遇到一個狀況是,Nginx 可以在同一個網域下去建立如同虛擬目錄的路徑,例如 domain.net/YOUR-APP
,這個 YOUR-APP
其實是不存在的目錄,然而在 ASP.NET Core 中要如何將處理像這樣的虛擬目錄的問題呢?
此篇的處理方式,同樣可以處理將應用程式放在 IIS 的虛擬目錄時的狀況。
ASP.NET Core 預設會使用內建的 Kestrel 微型網頁伺服器來啟動網頁應用程式,因此 ASP.NET Core 不需要掛到任何網頁伺服器(如 IIS、Apache)也可以啟動網頁,然而 Kestrel 沒有虛擬目錄的設定選項,要處理虛擬目錄的問題,則是需要靠 ASP.NET Core 的中介軟體(Middleware)來處理。
在 ASP.NET Core 2.1 之後的版本,我們可以使用官方提供的 UsePathBase()
擴充方法來處理這件事,不用再自己寫了,如果你對這支官方所提供的擴充方法寫法有興趣,可以從這裡看到原始碼,或這裡查看官方文件。
基本上使用方法相當簡單,只要在 Configure()
中加入一段設定即可,如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UsePathBase("/YOUR-APP");
app.UseRouting();
// 略
}
至於這個路徑你要怎麼做成動態設定,根據執行環境做變化,就看你如何規劃,這個路徑值你可以放在環境變數、appsettings.json
設定檔、或是用程式碼寫死也都可以。
但有三件事要注意:
第一,請將此設定放在最前面,例如在 app.UseStaticFiles()
或 app.UseMvc()
的前面,這樣 ASP.NET Core 才會在 HTTP Request 一進來就去判斷是不是在正確的路徑上。
第二,記得後面要加上 app.UseRouting()
來套用路由機制。
第三,虛擬路徑的值前面要加 /
不然不會有作用。
如此一來,無論你是要用 IIS 虛擬目錄來掛載網頁應用程式,還是用像是 Nginx 這樣的反向代理,都可以用作簡潔的方式處理好根目錄的問題了。
參考資料: