繁体   English   中英

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

[英]ASP.NET MVC behind NGINX reverse proxy

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

我是NGINX的新手,所以知识不足。

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

HTTP://本地主机:9999 /富/酒吧/

然后它将代理到我在本地设置的NGINX的MVC5应用程序的根目录(端口9998),以测试该站点将按预期运行。 我们使用到资源的绝对路径(托管在内部CDN中),因此所有这些负载均符合预期。

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

MVC应用程序未意识到它正在反向代理后面运行,并且将子路径从其派生URL中砍掉。

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

HTTP://本地主机:9999 /家

代替 :

HTTP://本地主机:9999 /富/酒吧/家

有谁有想法抵消这一点? 我可以看到.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;
    }

}
}

您可以使用UsePathBase代码,例如:

 app.UsePathBase($"ApplicationFolder").UseMvc(routes =>
                {
                     routes.MapRoute(
                           "default", GetDefaultRoutePath());
                });

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

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

解决方案一

抱歉,我无法访问这台机器上的工作测试代码,但它类似于以下内容:

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

     protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues) 

解决方案二

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

NB。 您需要谨慎对待任何相对路径/链接以及任何代理。

我目前正在生产中使用此方法,没有任何问题。 请参见以下示例。

例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM