【问题标题】:ASP.NET MVC behind NGINX reverse proxyNGINX 反向代理背后的 ASP.NET MVC
【发布时间】:2018-07-25 15:18:15
【问题描述】:

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

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

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

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

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

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

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

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

http://localhost:9999/home

而不是:

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

有没有人有任何想法来抵消这个?我可以看到 .NET 核心有一个解决方法,但看不到 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;
    }

}
}

【问题讨论】:

  • 您找到解决此问题的方法了吗?另外,您提到的 .NET Core 的解决方法是什么?
  • 解决方案现在详述如下。

标签: c# asp.net-mvc nginx iis reverse-proxy


【解决方案1】:

我现在已经找到了两种解决方案...

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

解决方案一

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

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

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

解决方案二

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

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

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

【讨论】:

  • RouteValueDictionary 中的内容是什么
【解决方案2】:

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

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

【讨论】:

  • 注意。这仅适用于 .NET 核心。
猜你喜欢
  • 2012-02-04
  • 2019-03-14
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2022-06-23
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多