Nginx正在80端口上运行,我用这个方法将path /foo
代理URL反向转换为3200
端口:
location /foo { proxy_pass http://localhost:3200; proxy_redirect off; proxy_set_header Host $host; }
这工作正常,但我有一个应用程序在端口3200
,我不希望最初/foo
发送到。 那就是 – 当我访问http://localhost/foo/bar
,我只希望/bar
成为应用程序接收的path。 所以我试着把这一行添加到上面的位置块:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
这导致302redirect(更改URL),但我想301.我该怎么办?
任何redirect到本地主机从远程系统(例如客户端的Web浏览器)是没有意义的。 所以重写标志永久(301)或redirect(302)不适用于你的情况。
请使用透明重写规则尝试以下设置:
location /foo { rewrite /foo(.*) /$1 break; proxy_pass http://localhost:3200; proxy_redirect off; proxy_set_header Host $host; }
只要您在proxy_pass指令中指定URI,简单的位置前缀匹配就不需要使用重写规则:
location /foo { proxy_pass http://localhost:3200/; }
注意proxy_pass
指令结尾的附加/
。 NGINX将去掉匹配的前缀/foo
,并将剩余的余数传递给URI /
后端的服务器。 因此, http://myserver:80/foo/bar
会在http://localhost:3200/bar
发布到后端。
来自proxy_pass上的NGINX文档 :
如果proxy_pass指令是使用URI指定的,那么当请求传递给服务器时,与该位置匹配的标准化请求URI部分将被指令中指定的URIreplace:
绝对最正确的方法和最佳做法通常如下:
location /foo/ { proxy_pass http://localhost:3200/; # note the trailing slash! }
请注意proxy_pass
尾部斜线的重要性,它会自动更改$uri
variables,以使前端上的/foo/
与后端上的/foo/
相对应。 不需要明确的rewrite
指令。
此外,请注意, 尾部/
location
也非常重要 – 否则,您可能会在网站上出现奇怪的URL(例如,除/foo/en
之外的工作/fooen
)。
另外,根据location
指令的文档, proxy_pass
的尾部/
location
也确保了一些特殊的处理 ,以便有效地引起隐式location = /foo {return 301 /foo/;}
。
因此,通过使用上面的斜线定义一个location
,不仅可以确保/fooen
没有斜杠的后缀URL不会有效,而且不带尾随斜杠的a /foo
也将继续工作。
参考文件:
尝试
location /foo { proxy_pass http://localhost:3200/; ....
要么
location ^~ /foo { proxy_pass http://localhost:3200/; ....