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://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)
我现在为上述问题找到了两种解决方案......
我选择了解决方案二,因为它不需要更改代码,但已成功测试了这两种解决方案
解决方案一
抱歉,我无权访问这台机器上的工作测试代码,但它如下所示:
创建自定义重定向结果对象并将 baseurl 附加到 URL。从重写的方法返回自定义结果对象。
protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues)
Run Code Online (Sandbox Code Playgroud)解决方案二
使用 IIS,在虚拟目录或子应用程序中运行应用程序以匹配代理的位置。然后,MVC 将自动正确地控制所有路由,而无需重写任何基本方法。
注意。您需要像对待任何代理一样小心对待任何相对路径/链接。
我目前在生产中使用这种方法没有任何问题。请参见下面的示例。
| 归档时间: |
|
| 查看次数: |
3335 次 |
| 最近记录: |