将虚拟路径设置为 nginx 反向代理后面的 ASP NET Core MVC 应用程序

sat*_*ril 3 asp.net-mvc nginx asp.net-core

我有一个 ASP NET Core 应用程序在 docker 容器内运行,我尝试使用我在另一个 docker 容器内构建的 NGINX 反向代理来访问该应用程序。

当我尝试使用在 Nginx .conf 文件上配置的虚拟路径访问 MVC 应用程序时,如下所示:“ http://localhost:1000/mvcapp/ ”,所有使用相对路径的 css、js 和 othrr 静态文件找不到,因为 mvc 不处理虚拟路径来正确配置这些文件的路径。

我的网址:http://localhost:1000/mvc

mvc构建的路径:href="/css/bootstrap.css"

mvc 的正确构建方式: href="mvc/css/bootstrap"

itm*_*nus 8

听起来您的反向代理的工作方式/mvcapp如下/所示:

location /mvcapp {
    proxy_pass         http://localhost:6009/;    # assume you expose the 6009 port
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,那是因为代理切断了前缀/mvcapp。并且您的 MVC 应用程序没有意识到虚拟应用程序路径是/mvcapp. 要解决这个问题,请添加一个中间件来显式设置PathBase

公共无效配置(IApplicationBuilder 应用程序,IWebHostEnvironment env)
{
    // 添加这个中间件作为一个
    app.Use((context, next)=> {
        context.Request.PathBase = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH");
        返回下一个();
    });          
    // ...其他中间件
}

ASPNETCORE_APPL_PATH在启动docker时传递环境。例如,您可以在命令中传递环境:

## 假设您要将端口 6009 映射到 80,
## 镜像名称为 nginxtocore
docker run -p 6009:80 -e ASPNETCORE_APPL_PATH='/mvcapp'   nginxtocore