Nginx正则location配置Proxy Pass的问题求助
Nginx配置问题分析与修复
原配置问题说明
第一个配置异常原因
location ~ ^/(900[0-9]|90[1-9][0-9]|9100) { rewrite ^/(?:(900[0-9]|90[1-9][0-9]|9100))/(.*)$ /$1 break; proxy_pass http://192.168.2.5:$1; }
这个配置的rewrite规则仅匹配带后续路径的请求(如/9100/xxx),但直接访问/9100时,rewrite不会触发,此时请求路径仍为/9100,被代理到后端192.168.2.5:9100/9100,若后端未配置对应路径的路由,就会出现访问异常。
第二个配置静态资源加载失败原因
location ~ ^/(900[0-9]|90[1-9][0-9]|9100) { proxy_pass http://192.168.2.5:$1; }
该配置未修改请求路径,访问/9100时会被代理到192.168.2.5:9100/9100,后端若能处理这个路径则返回页面,但页面内的静态资源使用相对路径(如asset/vendor.css)时,浏览器会基于当前URL(http://192.168.2.5:9180/9100)拼接成http://192.168.2.5:9180/asset/vendor.css——这个请求路径以/asset开头,无法被当前的location规则匹配,导致静态资源无法被代理到后端,加载失败。
正确配置方案
使用以下配置,既能处理根路径请求(如/9100),也能正确代理所有子路径请求,同时保证浏览器请求的静态资源路径会被Nginx拦截并代理:
location ~ ^/(900[0-9]|90[1-9][0-9]|9100)(/.*)?$ { # 将请求路径中的端口前缀去掉,仅保留后续路径(无后续路径则为空) rewrite ^/(900[0-9]|90[1-9][0-9]|9100)(/.*)?$ $2 break; proxy_pass http://192.168.2.5:$1; }
配置原理
location规则匹配所有以目标端口(如9100)开头的请求,包括根路径(/9100)和子路径(/9100/asset/vendor.css)。rewrite规则将请求路径中的端口前缀移除:- 访问
/9100时,$2为空,最终代理到http://192.168.2.5:9100/(后端根路径)。 - 访问
/9100/asset/vendor.css时,$2为/asset/vendor.css,最终代理到http://192.168.2.5:9100/asset/vendor.css。
- 访问
- 浏览器请求静态资源时,会基于当前URL(
http://192.168.2.5:9180/9100)拼接出/9100/asset/vendor.css,这个路径会被location规则匹配,进而被正确代理到后端。
替代方案(无需rewrite)
也可以直接通过proxy_pass的变量拼接实现,效果一致:
location ~ ^/(900[0-9]|90[1-9][0-9]|9100)(/.*)?$ { proxy_pass http://192.168.2.5:$1$2; }
内容的提问来源于stack exchange,提问作者Nope
相关产品推荐
相关产品推荐

