You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:27:00