Nginx实现带参数URL重写代理且不修改原URL的问题
Nginx URL转发配置修正
你原来的配置问题出在这几点:
- 多个
rewrite规则里第一个就加了break,导致后面的规则根本不会执行,只能捕获到第一个参数p1 - 第四个
rewrite的正则语法错误,/(.*)$多写了一个$,应该是/(.*) - 这种逐个捕获的方式本来就没法同时拿到四个参数,自然没法正确拼接成目标URL
给你两种可行的配置方案:
方案一:用rewrite一次性捕获参数
location /report/bill/ { rewrite ^/report/bill/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ /reports/servlet?param1=$1¶m2=$2¶m3=$3¶m4=$4 break; proxy_pass http://192.168.0.1:9002; }
这里用[^/]+精准匹配每个参数(只捕获斜杠前的内容),一次性提取四个参数后重写URL路径,再通过proxy_pass转发到目标服务器。
方案二:用location正则直接匹配
location ~ ^/report/bill/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ { proxy_pass http://192.168.0.1:9002/reports/servlet?param1=$1¶m2=$2¶m3=$3¶m4=$4; }
这种方式直接在location的正则规则里捕获四个参数,省去rewrite步骤,直接拼接目标URL完成转发。
如果需要支持参数数量可变的场景(比如少于四个参数),可以调整正则为可选匹配,但针对你固定四个参数的需求,上面的配置完全够用。
内容的提问来源于stack exchange,提问作者Andreas Constantinou
相关产品推荐
相关产品推荐

