首页 文章

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

提问于
浏览
2

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

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

反向代理将放置在子路径上 . (以下示例)

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

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

My Issue - 反向代理正常工作并显示应用程序的根页面 . 当遇到使用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;
    }

}
}

2 回答

  • 0

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

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

    Solution One

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

    • 创建基本控制器并覆盖ControllerBase.RedirectToAction方法 .

    • 将基本URL设置添加到webconfig(或数据库设置等) .

    • 创建自定义重定向结果对象并将baseurl附加到URL . 从重写方法返回自定义结果对象 .

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

    Solution Two

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

    NB. You will need be careful with any relative paths/links as with any proxy.

    我目前在 生产环境 中使用这种方法没有任何问题 . 见下面的例子 .

    Example

  • 0

    您可以使用UsePathBase代码,如:

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

相关问题