NGINX 反向代理背后的 ASP.NET MVC

Rob*_*ing 6 c# iis asp.net-mvc reverse-proxy nginx

我目前正在开发一个项目,该项目需要我们当前的 ASP.NET MVC5 Web 应用程序之一位于客户端将控制的 NGINX 反向代理后面。

我是 NGINX 的新手,所以缺乏知识。

反向代理将放置在子路径中。(下面的例子)

http://localhost:9999/foo/bar/

然后,这将代理到 MVC5 应用程序的根(端口 9998),我已在本地设置了 NGINX 以测试该站点是否按预期工作。我们使用资源的绝对路径(托管在内部 CDN 中),因此所有这些都按预期加载。

我的问题- 反向代理工作正常并显示应用程序的根页面。当点击使用 this.RedirectToAction() 或 @html.ActionLink() 等创建的任何控制器方法/页面链接时,问题开始出现。

MVC 应用程序没有意识到它正在反向代理后面运行,并从其派生 URL 中删除了该子路径。

所以重定向到家庭控制器看起来像

http://本地主机:9999/home

代替 :

http://localhost:9999/foo/bar/home

有人有什么想法可以抵消这个吗?我可以看到 .NET core 有一个解决方法,但看不到 MVC5 的任何内容。我可以使用 this.Redirect() 并指定绝对路径,但应用程序很大,并且在没有反向代理的其他场景中使用。

这个问题可以通过我的 NGINX 配置来解决吗?我在下面包含了我的配置:

#user  nobody;
worker_processes  1;

events {
worker_connections  1024;
}

http {
include       mime.types;
default_type  application/octet-stream;
sendfile        on;


keepalive_timeout  65;

server {
    listen       9999;
    server_name  localhost;

    location /foo/bar/ {

        rewrite ^/foo/bar/(.*)$ /$1 break;
        proxy_pass  http://127.0.0.1:9998/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ing 1

我现在为上述问题找到了两种解决方案......

我选择了解决方案二,因为它不需要更改代码,但已成功测试了这两种解决方案

解决方案一

抱歉,我无权访问这台机器上的工作测试代码,但它如下所示:

  1. 创建一个基本控制器并重写 ControllerBase.RedirectToAction 方法。
  2. 将基本 URL 设置添加到您的 webconfig(或数据库设置等)。
  3. 创建自定义重定向结果对象并将 baseurl 附加到 URL。从重写的方法返回自定义结果对象。

    protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues)
    
    Run Code Online (Sandbox Code Playgroud)

解决方案二

使用 IIS,在虚拟目录或子应用程序中运行应用程序以匹配代理的位置。然后,MVC 将自动正确地控制所有路由,而无需重写任何基本方法。

注意。您需要像对待任何代理一样小心对待任何相对路径/链接。

我目前在生产中使用这种方法没有任何问题。请参见下面的示例。

例子