我目前正在从事一个项目,该项目需要我们当前的ASP.NET MVC5 Web应用程序之一位于客户端将控制的NGINX反向代理之后。
我是NGINX的新手,所以缺乏知识。
反向代理将放置在子路径中。 (下面的示例)
http://localhost:9999/foo/bar/
然后它将代理到我在本地设置的NGINX的MVC5应用程序的根目录(端口9998),以测试该站点将按预期运行。我们使用资源的绝对路径(托管在内部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;
}
}
}
答案 0 :(得分:0)
您可以使用UsePathBase代码,例如:
app.UsePathBase($"ApplicationFolder").UseMvc(routes =>
{
routes.MapRoute(
"default", GetDefaultRoutePath());
});
答案 1 :(得分:0)
我现在找到了上述两种解决方案...
我选择了解决方案二,因为它不需要更改代码,但已经成功测试了两种解决方案
解决方案一
抱歉,我无法访问这台机器上的有效测试代码,但它类似于以下内容:
创建自定义重定向结果对象,并将baseurl附加到URL。从覆盖的方法返回自定义结果对象。
protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues)
第二种解决方案
使用IIS,在虚拟目录或子应用程序中运行该应用程序以匹配代理的位置。然后,MVC将自动正确控制所有路由,而不必覆盖任何基本方法。
NB。您需要注意任何相对路径/链接以及任何代理。
我目前正在生产中使用此方法,没有任何问题。参见下面的示例。