Asp.net-Core

具有不同根的 ASP.Net Core 反向代理

  • April 1, 2022

我在代理 ASP.NET Core MVC 應用程序時遇到問題。

我的應用程序在 Kestrel 上執行,localhost:5000而我的 Apache 2.4 反向代理在localhost:80. 我想代理所有localhost:80/test請求localhost:5000

這是httpd.conf代理的部分:

...
<Location "/test">
  ProxyPass "http://localhost:5000"
  ProxyPassReverse "http://localhost:5000"
</Location>
...

代理有效,但是所有連結都已損壞。就像我有一個錨點連結到一個以HomeControlleraction命名的控制器About,從代理返回的連結localhost/Home/About不是localhost/test/Home/About. 主機是正確的,test缺少的是上下文根。

處理此問題的最佳做法是什麼?是否是 ASP.NET Core 中的配置來指定上下文根以便 TagHelpers 將其考慮在內?或者它是 ApacheProxyPass中重寫連結的配置(真的不是這個的忠實粉絲)?

問題是 web 應用程序不知道 subpath /test,所以在你的情況下,它只會響應,就好像它是直接在根路徑呼叫一樣。

ASP.NET Core 有一個PathBase解決此問題的概念。本質上PathBase是請求的 URI 路徑的一部分,將被視為路徑的固定部分。每當框架內的組件生成 URL 時,它都會考慮目前PathBase並確保將其作為所有生成路徑的前綴。

預設情況下,PathBase將是空的,這取決於您的反向代理的配置來說明您應該如何設置PathBase.

使用PathBase中間件

有內置的UsePathBaseMiddleware可用於臨時配置PathBase傳入請求。Path該中間件的工作方式基本上是檢查請求是否以可接受的路徑前綴開頭,如果是,則該前綴將從PathBase.

您可以使用UsePathBaseExtensions.UsePathBase擴展方法啟動它。Configure只需使用您要使用的基本路徑將該方法作為啟動方法中的第一件事來呼叫:

public void Configure(IApplicationBuilder app)
{
   app.UsePathBase("/test");

   // all the other middlewares
   app.UseStaticFiles();
   app.UseMvc();
   // …
}

由於中間件只會PathBase在它看到/test傳入請求路徑中的前綴時才會調整,因此您需要確保反向代理實際上包含該前綴。因此,您必須調整 Apache 配置以包含該路徑:

<Location "/test">
  ProxyPass "http://localhost:5000/test"
  ProxyPassReverse "http://localhost:5000/test"
</Location>

請注意,UsePathBaseMiddleware 不會阻止應用程序在沒有該前綴的情況下工作。所以你實際上可以在有和沒有基本路徑的情況下使用它,它會正確適應。

自定義中間件

如果您不想調整反向代理配置以在轉發的請求中包含路徑,那麼您將無法使用UsePathBaseMiddleware. 相反,您必須在那裡添加自己的非常簡單的中間件:

public void Configure(IApplicationBuilder app)
{
   app.Use((context, next) =>
   {
       context.Request.PathBase = "/test";
       return next();
   });

   // all the other middlewares
   app.UseStaticFiles();
   app.UseMvc();
   // …
}

這將設置為傳入請求/test常量。 PathBase所以實際傳入的請求不必包含它,這意味著您可以保持反向代理配置不變(而不是在/test那裡轉發路徑)。但是,這也意味著與根據傳入請求動態設置的UsePathBaseMiddleware位置不同,現在對應用程序的所有請求都將需要該路徑,無論它們是否通過反向代理。PathBase

引用自:https://stackoverflow.com/questions/45311393