加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 具有不同root的ASP.Net核心反向代理

发布时间:2020-12-16 07:29:58 所属栏目:asp.Net 来源:网络整理
导读:我在代理ASP.NET Core MVC应用程序时遇到问题. 我的应用程序在本地主机上运行Kestrel:5000,我的Apache 2.4反向代理在localhost:80上运行.我想将来自localhost:80 / test的所有请求代理到localhost:5000 这是代理的httpd.conf部分: ...Location "/test"
我在代理ASP.NET Core MVC应用程序时遇到问题.

我的应用程序在本地主机上运行Kestrel:5000,我的Apache 2.4反向代理在localhost:80上运行.我想将来自localhost:80 / test的所有请求代理到localhost:5000

这是代理的httpd.conf部分:

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

代理工作,但所有链接都被破坏.就像我有一个锚点链接到一个名为HomeController的控制器并执行操作About,从代理返回的链接是localhost / Home / About而不是localhost / test / Home / About.主机是正确的,它是缺少的上下文根测试.

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

解决方法

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

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

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

UsePathBaseMiddleware

内置的UsePathBaseMiddleware可用于为传入请求临时配置PathBase.这个中间件的工作方式基本上是它将检查请求是否以接受的路径前缀开始,如果是,则该前缀将从Path移动到PathBase中.

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

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

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

由于中间件只会在传入请求的路径中看到/ test前缀时调整PathBase,因此您需要确保反向代理实际上包含该前缀.因此,您必须调整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();
    // …
}

这将设置/测试为传入请求的常量PathBase.因此,实际传入的请求不必包含它,这意味着您可以保留反向代理配置(而不是转发/ test路径).但是,这也意味着与UsePathBaseMiddleware不同,其中PathBase是根据传入请求动态设置的,现在对应用程序的所有请求都需要该路径,无论它们是否通过反向代理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读