Nginx中location与rewrite正则捕获组的合并及引用规则问询
Nginx捕获组相关问题解答
捕获组明细
location指令中的捕获组:^/([\d]+)/里的([\d]+)是第1个捕获组,匹配URL开头的数字段rewrite指令中的捕获组:^/[\d]+/([\d]+)/(.*)$里的([\d]+)是第2个捕获组,匹配中间的数字段;(.*)是第3个捕获组,匹配剩余所有路径内容
捕获组的替换与合并逻辑
Nginx中location和rewrite的捕获组是独立计数的,不会自动合并。但rewrite执行后,后续指令(比如proxy_pass)引用的$n会优先指向rewrite生成的捕获组;如果rewrite带last或break标记终止处理,$n则会沿用location的捕获组。另外你当前的rewrite写法不完整,缺少替换目标和标记,实际运行会报错。
捕获组的存在性与顺序
如果rewrite指令正确执行且未终止,此时会存在3个捕获组,顺序逻辑上是:
location中的([\d]+)rewrite中的第一个([\d]+)rewrite中的(.*)
但要注意:rewrite的捕获组会占用$1、$2这类靠前的引用位,location的捕获组会被挤到$10及以后的位置(比如用$10引用location的捕获组)。
如何在proxy_pass中正确引用捕获组
要同时引用这三个捕获组,推荐用以下两种方式:
- 用
set指令保存location的捕获组,避免被rewrite覆盖:
location ~ ^/([\d]+)/ { set $loc_num $1; # 留存location的捕获组内容 rewrite ^/[\d]+/([\d]+)/(.*)$ /anything/$loc_num/$1/$2 break; # 完成URL重写并终止 proxy_pass https://httpbin.org; }
- 简化结构,直接在
location中匹配所有需要的捕获组:
location ~ ^/([\d]+)/([\d]+)/(.*)$ { proxy_pass https://httpbin.org/anything/$1/$2/$3; }
如果坚持使用原结构,需通过$10引用location的捕获组:
location ~ ^/([\d]+)/ { rewrite ^/[\d]+/([\d]+)/(.*)$ last; proxy_pass https://httpbin.org/anything/$10/$1/$2; }
注意:
rewrite指令必须包含替换目标(允许为空)和合适的标记(last/break),否则配置无法生效。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

