Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 具有不同根目录的ASP.Net核心反向代理_Asp.net Core_Reverse Proxy - Fatal编程技术网

Asp.net core 具有不同根目录的ASP.Net核心反向代理

Asp.net core 具有不同根目录的ASP.Net核心反向代理,asp.net-core,reverse-proxy,Asp.net Core,Reverse Proxy,我在代理ASP.NET核心MVC应用程序时遇到问题 我的应用程序运行在Kestrel上的localhost:5000,我的Apache 2.4反向代理运行在localhost:80上。我想将所有请求从localhost:80/test代理到localhost:5000 以下是代理的httpd.conf部分: ... <Location "/test"> ProxyPass "http://localhost:5000" ProxyPassReverse "http://l

我在代理ASP.NET核心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>
...
。。。
ProxyPass“http://localhost:5000"
ProxyPassReverse“http://localhost:5000"
...
代理可以工作,但是所有链接都断开了。就像我有一个锚链接到一个名为
HomeController
的控制器,操作是
About
,从代理返回的链接是
localhost/Home/About
,而不是
localhost/test/Home/About
。主机是正确的,缺少的是上下文根
test


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

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

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

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

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

您可以使用扩展方法来激活它。只需在启动的
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>

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

代理正在删除请求路径信息,因此您必须通过以下操作重新引入它:

应用程序使用((上下文,下一步)=> { context.Request.PathBase=“/test”; 返回next(); });


这与UsePathBase所做的不同,它将仍然存在的路径段从路径的起点移动到PathBase的终点

这正是我想要的。我还能够根据方法名找到github上讨论的问题。还是这样吗?我也有同样的问题,但是
UsePathBase
中间件似乎没有改变任何东西@是的,这仍然是一条路要走。如果启用路径库,则应用程序应在
https://example.com/
https://example.com/test/
。应用程序正在“/”处运行,但我正在“/app”处反向代理它。它似乎总是认为它仍然以“/”的形式运行。如果您直接打开站点而不是通过反向代理,它是否有效?如果它是这样工作的,那么您的反向代理可能配置错误。您在此场景中对非windows.Doc writeup执行的上述测试:
public void Configure(IApplicationBuilder app)
{
    app.Use((context, next) =>
    {
        context.Request.PathBase = "/test";
        return next();
    });

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