Nginx rewrite规则依赖PCRE,需掌握^$锚定、*+?量词、.\d\w字符类、()捕获分组等高频易错符号:^/$锚定位置;*+?控制重复次数;.匹配非换行符,dw更精准;()捕获内容供$1引用。

nginx rewrite 规则依赖 PCRE 正则表达式,写对符号才能精准匹配 URI。关键不是背全所有符号,而是掌握高频、易错、影响逻辑的那几个。
^ 和 $:锚定开头和结尾
它们不匹配字符,只匹配位置。没加它们,容易误匹配。
-
^/user只匹配以/user开头的路径,比如/user/login✅,但/api/user❌ -
/user/$只匹配刚好是/user/的路径(结尾必须是 /),/user或/user/profile都不匹配 -
^/user/$最严格:只匹配/user/这个完整路径,多一个字符或少一个斜杠都不行
*、+、?:重复量词,区别很关键
它们控制前面那个字符或分组出现的次数,写错会导致规则完全失效或过度匹配。
-
abc*:c 可出现 0 次或多次 → 匹配ab、abc、abcc -
abc+:c 至少出现 1 次 → 匹配abc、abcc,但不匹配ab -
abc?:c 出现 0 次或 1 次 → 匹配ab、abc,但不匹配abcc - 常见误用:
/user/*想匹配/user/xxx,其实应写/user/.+或/user/[^/]+;*前面如果没有确定字符(如.*),就容易泛滥匹配
. 和 d、s、w:通配与常用字符类
. 看似简单,但默认不匹配换行符,且容易过度匹配;字符类更安全可控。
-
/.*/会匹配任意非换行内容,包括空路径、多个斜杠,慎用 -
d等价于[0-9],匹配单个数字,比如/post/d+→/post/123 -
w匹配字母、数字、下划线([A-Za-z0-9_]),适合匹配用户名、ID等,如/user/(w+) -
s匹配空白符(空格、制表符等),一般 URL 中极少出现,基本不用在 rewrite 中
() 和 $1、$2:捕获分组与反向引用
这是实现动态重写的刚需能力,把匹配到的部分“抽出来”用在 replacement 里。
-
rewrite ^/old/(.*)$ /new/$1 last;:括号捕获/old/后所有内容,$1就代表它 - 多个括号按从左到右顺序编号:
^/(d+)/(w+)$中,$1是数字部分,$2是单词部分 - 非捕获组
(?:...)不生成$n,仅用于逻辑分组,nginx 支持但较少用,优先用普通括号+明确命名


















