Nginx正则location场景下避免将正则匹配部分传递给proxy_pass的解决方案咨询
Nginx正则location场景下避免将正则匹配部分传递给proxy_pass的解决方案咨询
嗨,这个问题我之前配置Nginx的时候也碰到过,正则location搭配带尾斜杠的proxy_pass确实会触发语法错误,给你两个可行的方案,都能满足你不修改浏览器地址栏、同时不把正则匹配的路径传递到后端的需求:
方案一:用rewrite内部改写URI(无重定向)
通过rewrite指令结合break参数,在Nginx内部改写请求URI,不会给客户端发送重定向响应,浏览器地址栏完全保留原路径:
location ~ ^/(.*)/front/ { # 如果你想把/xxx/front/后面的路径也转发到后端(比如/123/front/abc → 后端收到/abc) # rewrite ^/(.*)/front/(.*)$ /$2 break; # 如果你只想把所有匹配的请求都转发到后端的根路径(不管后面有没有子路径) rewrite ^/(.*)/front/ / break; proxy_pass http://backend:8081; }
这里的break关键字很关键,它会让Nginx停止后续的rewrite规则处理,直接用改写后的URI执行proxy_pass,完全是内部处理,不会影响客户端的地址栏。
方案二:使用变量构造proxy_pass目标路径
当proxy_pass使用变量形式时,Nginx不会自动拼接location正则匹配到的路径,而是直接使用变量指定的路径,这样就能绕过正则location下不能带尾斜杠的限制:
location ~ ^/(.*)/front/ { set $proxy_backend http://backend:8081/; proxy_pass $proxy_backend; }
这个配置会把所有匹配^/(.*)/front/的请求,直接转发到http://backend:8081/,后端收到的请求URI就是/,同时浏览器地址栏保持原请求路径不变。
你可以根据自己的实际需求选择其中一个方案,亲测都能解决你的问题~
备注:内容来源于stack exchange,提问作者Sijian
相关产品推荐
相关产品推荐

