Nginx反向代理+ URL重写

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/; ....