在 nginx 的 rewrite 指令中,正则表达式捕获组通过圆括号 () 定义,并在替换字符串中使用 $1 到 $9 进行引用。具体做法是在匹配模式中将需要提取的部分用括号包裹,然后在重写目标中按顺序填入对应的变量,nginx 会直接将捕获的内容插入到该位置。

如何从 URL 路径中提取参数并重写?
要从 URL 路径中提取特定片段并重写,需要在正则表达式中使用括号明确界定要捕获的范围,并在重写规则的目标部分使用 $1 引用第一个捕获组。例如,将带查询参数的旧格式 URL 转换为静态文件路径时,可以匹配路径中的文件名和扩展名,然后将其拼接成新的内部路径。

server {
listen 80;
server_name example.com;
# 示例:将 /api/v1/users/123?format=json 重写为 /api/v1/users/123.json
location /api/ {
rewrite ^/api/(v[0-9]+)/([a-z]+)/(\d+)$ /api/$1/$2.$3 last;
}
}
上述配置中,(v[0-9]+) 捕获版本号并映射到 $1,([a-z]+) 捕获资源类型并映射到 $2,(\d+) 捕获 ID 并映射到 $3。最终请求会被重写到 /api/v1/users.123。注意正则中的点号需要转义,而数字和字母字符类直接书写即可。执行结果是将原始路径拆解后重新组合,保留所有捕获段。
如何处理多条件匹配与默认值回退?
当存在多种可能的 URL 结构但希望统一处理时,可以使用交替符 | 结合捕获组来匹配不同格式,并通过逻辑判断或后续规则处理差异。如果某些部分可能缺失,可以通过设置默认值或在应用层处理空值。在实际操作中,通常先尝试精确匹配,再 fallback 到通用规则。

server {
listen 80;
server_name example.com;
# 匹配 /old-page 或 /legacy/page 并重写到 /new-page
location / {
rewrite ^/(old-page|legacy/page)$ /new-page permanent;
}
}
在这个例子中,(old-page|legacy/page) 是一个包含两个选项的捕获组,虽然这里没有实际提取内容用于替换,但它允许我们同时匹配两种不同的旧路径。如果将来需要区分来源,可以将它们分别捕获为 $1 和 $2,并在日志或后端逻辑中使用。当前规则直接将两者都重定向到 /new-page,状态码为 permanent(301)。这种写法简化了多条 rewrite 规则的维护。
捕获组在复杂嵌套路径中的行为是什么?
在复杂的嵌套路径中,捕获组的编号严格按照左括号的出现顺序从左到右递增。即使某些组被嵌套在其他组内部,其引用依然遵循外层到内层的顺序。例如,在 ((a)(b)) 中,$1 对应整个 (a)(b),$2 对应 a,$3 对应 b。这种层级关系在处理深层目录结构或 API 版本控制时非常关键,开发者必须确保括号配对正确,否则会导致捕获错位或匹配失败。











