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

Cur*_*ire 5 reverse-proxy asp.net-core

我在代理ASP.NET Core MVC应用程序时遇到问题.

我的应用程序在Kestrel上运行localhost:5000,我的Apache 2.4反向代理正在运行localhost:80.我要代理的所有请求localhost:80/testlocalhost:5000

这是httpd.conf代理的部分:

...
<Location "/test">
   ProxyPass "http://localhost:5000"
   ProxyPassReverse "http://localhost:5000"
</Location>
...
Run Code Online (Sandbox Code Playgroud)

代理工作,但所有链接都被破坏.就像我有一个锚链接到一个以HomeController动作命名的控制器About,从代理返回的链接localhost/Home/About代替localhost/test/Home/About.主机是正确的,它test是缺少的上下文根.

处理这个问题的最佳做法是什么?ASP.NET Core中的配置是否指定了上下文根,以便TagHelpers将其考虑在内?或者它是Apache ProxyPass中重写链接的配置(真的不是这个的忠实粉丝)?

pok*_*oke 15

问题是Web应用程序不知道子路径/test,因此在您的情况下,它只会响应,就好像它是在根路径上直接调用一样.

ASP.NET Core有一个概念PathBase来解决这个问题.在PathBase本质上是将被认为是路径的固定部分的请求的URI路径的一部分.每当框架内的组件生成URL时,它都会考虑当前的流量PathBase,并确保将其作为所有生成路径的前缀.

默认情况下,PathBase它将为空,这取决于您的反向代理的配置,以说明您应该如何设置PathBase.

UsePathBaseMiddleware

内置的UsePathBaseMiddleware可用于临时配置PathBase传入请求.该中间件的工作方式基本上,它会检查该请求是否与所接受的路径前缀开头,如果确实如此,则该前缀会从被移动PathPathBase.

您可以使用UsePathBaseExtensions.UsePathBase扩展方法激活它.只需Configure使用您要使用的基本路径调用该方法作为Startup方法中的第一个方法:

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

    // all the other middlewares
    app.UseStaticFiles();
    app.UseMvc();
    // …
}
Run Code Online (Sandbox Code Playgroud)

由于中间件只会调整PathBase/test在传入请求路径中看到前缀的时间,因此您需要确保反向代理实际上包含该前缀.因此,您必须调整Apache配置以包含该路径:

<Location "/test">
   ProxyPass "http://localhost:5000/test"
   ProxyPassReverse "http://localhost:5000/test"
</Location>
Run Code Online (Sandbox Code Playgroud)

请注意,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();
    // …
}
Run Code Online (Sandbox Code Playgroud)

这将设置为传入请求/test常量 PathBase.因此,实际传入的请求不必包含它,这意味着您可以保留反向代理配置(而不是在/test那里转发路径).然而,这也意味着,不像用UsePathBaseMiddlewarePathBase被动态地设置取决于传入的请求,现在所有的应用程序请求将需要路径,不管他们是否经过反向代理与否.

  • 这篇文章包含的知识比我一整天阅读的五个 github.com/dotnet 问题和十几个官方文档更有价值。谢啦。 (2认同)