最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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…
- 示例:将
/article/123重写为/post?id=123 rewrite ^/article/(d+)$ /post?id=$1 last;- 其中
(d+)是第一个捕获组,$1即匹配到的数字
区分 $1 和 $args 中的同名变量
$1 引用的是正则捕获内容,与请求参数(如 $arg_id)或内置变量(如 $args)无关,不会自动合并或覆盖。
- 若原请求是
/article/456?from=home,$1仍是456,$args是from=home - 如需保留原始参数,可显式拼接:
rewrite ^/article/(d+)$ /post?id=$1&$args? last; - 末尾的
?可防止 Nginx 自动追加原始参数(避免重复)
非捕获组与命名捕获(Nginx 1.11.0+)
普通括号默认是捕获组。如只需分组逻辑但不引用,可用 (?:...) 声明非捕获组,节省资源。
- 例如:
rewrite ^/(?:en|zh)/article/(d+)$ /post?id=$1 last;——(?:en|zh)不产生$1,数字仍为$1 - Nginx 1.11.0 起支持命名捕获:
rewrite ^/article/(?d+)$ /post?id=$id last; - 命名后可用
$id替代$1,提升可读性,尤其在多组时更清晰
常见陷阱与注意事项
捕获行为依赖匹配成功且作用域正确,容易出错的地方包括:
-
rewrite必须放在能执行重写的上下文中(server、location),且优先级受location匹配规则影响 - 正则开头的
^和结尾的$很关键:缺少$可能导致部分匹配(如^/a(.*)会匹配/abc?x=1,但$1含问号后内容) - 特殊字符如点
.、问号?、斜杠/需转义(.、?、/),否则会被当作正则元字符或 URL 分隔符 - 若 rewrite 后需内部跳转,推荐用
last;若要外部 301/302 重定向,加上redirect或permanent