Nginx中如何提取路径前3段作为变量动态构建proxy_pass?
你的正则写法问题出在贪婪匹配:.* 属于贪婪匹配规则,会尽可能匹配最长的符合规则的字符串,所以你原配置里的第一个(.*)会直接匹配到a/b/c/d/e,后续两个分组只能拿到f和g,最终拼接的域名就不符合预期。
你可以把正则里的通配符替换为非斜杠匹配规则,就能精准提取前三个路径段,正确配置如下:
location ~ ^/proxy/([^/]+)/([^/]+)/([^/]+)(/.*)?$ { resolver 127.0.0.1; # 如果不需要透传剩余路径,直接使用如下配置 proxy_pass http://$1.$2.$3.host.com; # 如果需要把路径中前3段之后的部分透传给上游,替换为下面这条即可 # proxy_pass http://$1.$2.$3.host.com$4; }
配置逻辑说明
- 用
[^/]+替换了原来的.*,[^/]代表匹配除了路径分隔符/之外的所有字符,每个分组只会匹配一个完整的路径段,不会跨段匹配 - 前三个分组
([^/]+)分别对应/proxy/之后的前三个路径段,不受后续路径深度影响 - 后面的
(/.*)?是可选匹配,用来兼容前三个路径段之后所有的内容,不管后续路径有多长,都不会干扰前三个变量的提取结果 - 测试你给出的请求
curl 127.0.0.1/proxy/a/b/c/d/e/f/g时,$1=a、$2=b、$3=c,最终拼接的域名就是你预期的a.b.c.host.com
内容的提问来源于stack exchange,提问作者jk-kim
相关产品推荐
相关产品推荐

