Nginx rewrite支持正则捕获分组,用$1、$2等引用,命名捕获需1.11.0+;需注意匹配边界(^$)、转义特殊字符、作用域及参数拼接方式。
Nginx 的 rewrite 指令支持使用正则表达式,并可通过 $1、$2 等变量引用捕获的分组内容,但需注意匹配语法、作用域和转义细节。
在 rewrite 中使用带括号的正则表达式(PCRE)即可创建捕获组。Nginx 会按从左到右顺序编号,依次为 $1、$2、$3…
/article/123 重写为 /post?id=123
rewrite ^/article/(d+)$ /post?id=$1 last;(d+) 是第一个捕获组,$1 即匹配到的数字$1 引用的是正则捕获内容,与请求参数(如 $arg_id)或内置变量(如 $args)无关,不会自动合并或覆盖。
/article/456?from=home,$1 仍是 456,$args 是 from=home
rewrite ^/article/(d+)$ /post?id=$1&$args? last;
? 可防止 Nginx 自动追加原始参数(避免重复)普通括号默认是捕获组。如只需分组逻辑但不引用,可用 (?:...) 声明非捕获组,节省资源。
rewrite ^/(?:en|zh)/article/(d+)$ /post?id=$1 last; —— (?:en|zh) 不产生 $1,数字仍为 $1
rewrite ^/article/(?d+)$ /post?id=$id last;
$id 替代 $1,提升可读性,尤其在多组时更清晰捕获行为依赖匹配成功且作用域正确,容易出错的地方包括:
rewrite 必须放在能执行重写的上下文中(server、location),且优先级受 location 匹配规则影响^ 和结尾的 $ 很关键:缺少 $ 可能导致部分匹配(如 ^/a(.*) 会匹配 /abc?x=1,但 $1 含问号后内容).、问号 ?、斜杠 / 需转义(.、?、/),否则会被当作正则元字符或 URL 分隔符last;若要外部 301/302 重定向,加上 redirect 或 permanent