一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中 Rewrite 规则如何捕获并引用正则表达式中的分组参数

时间:2026-08-30 10:51:47 编辑:袖梨 来源:一聚教程网

Nginx rewrite支持正则捕获分组,用$1、$2等引用,命名捕获需1.11.0+;需注意匹配边界(^$)、转义特殊字符、作用域及参数拼接方式。

Nginx 的 rewrite 指令支持使用正则表达式,并可通过 $1$2 等变量引用捕获的分组内容,但需注意匹配语法、作用域和转义细节。

正则捕获分组的基本写法

rewrite 中使用带括号的正则表达式(PCRE)即可创建捕获组。Nginx 会按从左到右顺序编号,依次为 $1$2$3

  1. 示例:将 /article/123 重写为 /post?id=123
  2. rewrite ^/article/(d+)$ /post?id=$1 last;
  3. 其中 (d+) 是第一个捕获组,$1 即匹配到的数字

区分 $1 和 $args 中的同名变量

$1 引用的是正则捕获内容,与请求参数(如 $arg_id)或内置变量(如 $args)无关,不会自动合并或覆盖。

  1. 若原请求是 /article/456?from=home$1 仍是 456$argsfrom=home
  2. 如需保留原始参数,可显式拼接:rewrite ^/article/(d+)$ /post?id=$1&$args? last;
  3. 末尾的 ? 可防止 Nginx 自动追加原始参数(避免重复)

非捕获组与命名捕获(Nginx 1.11.0+)

普通括号默认是捕获组。如只需分组逻辑但不引用,可用 (?:...) 声明非捕获组,节省资源。

  1. 例如:rewrite ^/(?:en|zh)/article/(d+)$ /post?id=$1 last; —— (?:en|zh) 不产生 $1,数字仍为 $1
  2. Nginx 1.11.0 起支持命名捕获:rewrite ^/article/(?d+)$ /post?id=$id last;
  3. 命名后可用 $id 替代 $1,提升可读性,尤其在多组时更清晰

常见陷阱与注意事项

捕获行为依赖匹配成功且作用域正确,容易出错的地方包括:

  1. rewrite 必须放在能执行重写的上下文中(serverlocation),且优先级受 location 匹配规则影响
  2. 正则开头的 ^ 和结尾的 $ 很关键:缺少 $ 可能导致部分匹配(如 ^/a(.*) 会匹配 /abc?x=1,但 $1 含问号后内容)
  3. 特殊字符如点 .、问号 ?、斜杠 / 需转义(.?/),否则会被当作正则元字符或 URL 分隔符
  4. 若 rewrite 后需内部跳转,推荐用 last;若要外部 301/302 重定向,加上 redirectpermanent

热门栏目