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尾部斜线的重要性,它会自动更改$urivariables,以使前端上的/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/; ....