這個問題是使用 docker 生成了 asp.net core 網站鏡像,在使用 nginx 指向此鏡像容器后,用的子路徑虛擬路徑,但是因為反向代理,asp.net core 並不認為是從子路徑過來的,直接訪問 controller 的 action 方法沒問題,但是如果生成 view 內容時,view 再引用的資源路徑就會錯誤。
在 nginx 中的配置:
location /backstage/web/ { proxy_pass http://web-backstage/; proxy_set_header X_Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; }
解決方法(環境:.net core 3.1),修改 Startup.cs 配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var pathBase = Environment.GetEnvironmentVariable("ASPNETCORE_APP_PATH"); if (!string.IsNullOrWhiteSpace(pathBase)) { Console.WriteLine("ASPNETCORE_APP_PATH:" + pathBase); //1、配置請求基地址(解決 view 的路徑生成錯誤): app.Use((context, next) => { context.Request.PathBase = pathBase; return next(); }); // 2、配置靜態文件基地址(不配置的話,用上面生成的地址無法訪問到靜態文件): app.UsePathBase(pathBase); }
// 正常使用靜態文件
app.UseStaticFiles();
}
參考: