我目前正在开发一个项目,该项目要求我们当前的一个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 回答
我现在已经找到了两种解决方案......
我选择了 solution two ,因为它不需要更改代码,但已成功测试了两种解决方案
Solution One
道歉,我无法访问这台机器上的工作测试代码,但它如下所示:
创建基本控制器并覆盖ControllerBase.RedirectToAction方法 .
将基本URL设置添加到webconfig(或数据库设置等) .
创建自定义重定向结果对象并将baseurl附加到URL . 从重写方法返回自定义结果对象 .
Solution Two
使用IIS,在虚拟目录或子应用程序中运行应用程序以匹配代理的位置 . 然后,MVC将自动正确地控制所有路由,而不必覆盖任何基本方法 .
NB. You will need be careful with any relative paths/links as with any proxy.
我目前在 生产环境 中使用这种方法没有任何问题 . 见下面的例子 .
您可以使用UsePathBase代码,如: