【问题标题】:Set Virtual Path to ASP NET Core MVC Application behind nginx reverse proxy在 nginx 反向代理后面设置 ASP NET Core MVC 应用程序的虚拟路径
【发布时间】:2020-03-30 19:31:59
【问题描述】:
我有一个在 docker 容器中运行的 ASP NET Core 应用程序,我正在尝试使用我在另一个 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"
【问题讨论】:
标签:
asp.net-mvc
nginx
asp.net-core
【解决方案1】:
听起来您的反向代理的工作方式是将/mvcapp 映射到/,如下所示:
location /mvcapp {
proxy_pass http://localhost:6009/; # assume you expose the 6009 port
...
}
如果是这样,那是因为代理切断了/mvcapp 前缀。而且您的 MVC 应用程序没有意识到虚拟应用程序路径是 /mvcapp。要解决这个问题,请添加一个中间件来显式设置 PathBase:
公共无效配置(IApplicationBuilder 应用程序,IWebHostEnvironment env)
{
// 将此中间件添加为
first 中间件
app.Use((context, next)=> {
context.Request.PathBase = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH");
返回下一个();
});
// ... 其他中间件
}
并在启动docker时传递ASPNETCORE_APPL_PATH环境。例如,可以在命令中传递环境:
## 假设您要将端口 6009 映射到 80,
## 并且镜像名称是 nginxtocore
docker run -p 6009:80
-e ASPNETCORE_APPL_PATH='/mvcapp' nginxtocore