Nginx rewrite正则表达式必须用~或~*显式启用,区分大小写、不支持命名捕获组;rewrite指令首参数为PCRE正则,需转义特殊字符,捕获用()、引用用$1等,且仅匹配URI路径(不含查询参数)。

Nginx 的 rewrite 规则中,正则表达式写法和 PCRE(Perl Compatible Regular Expressions)标准一致,但有几点关键限制和习惯用法需要注意:它**区分大小写、不支持命名捕获组(如 (?<name>...)),且必须用 ~ 或 ~* 显式启用正则匹配**。
基础语法与匹配标志
在 rewrite 指令中,正则表达式必须放在第一个参数位置,并配合以下标志使用:
-
~:区分大小写的正则匹配(最常用) -
~*:不区分大小写的正则匹配 -
^~:前缀匹配(非正则,优先级高,但不进 rewrite 流程) - 纯字符串(无符号):精确或前缀匹配,也不走正则引擎
✅ 正确示例:rewrite ^/old/(.*)$ /new/$1 permanent;
⚠️ 错误写法:rewrite /old/(.*) /new/$1;(没加 ~,Nginx 当作普通字符串处理,不会触发正则捕获)
常用正则写法与捕获技巧
捕获用圆括号 (...),引用用 、 等。注意:
- URL 路径不带查询参数(
?key=val),query string 需用$args或$is_args$args手动拼接 - 开头的
/必须显式写出,^/是常见写法;结尾的$表示严格结尾,避免误匹配 - 特殊字符如
.、?、+、*需转义为\.、\?等(除非你本意就是量词)
? 示例:
把 /article/123.html → /post/123/rewrite ^/article/([0-9]+)\.html$ /post/$1/ permanent;
location 中的 rewrite 与 break 的关系
rewrite 在 location 块里执行时,是否继续后续规则,取决于有没有 last、break、redirect 或 permanent 标志:
-
last:停止当前 location 的 rewrite,重新匹配 location(慎用,可能循环) -
break:停止 rewrite,不再执行后续 rewrite,也不重匹配 location -
redirect:302 临时跳转(默认) -
permanent:301 永久跳转
? 推荐:简单跳转用 permanent 或 redirect;内部重写(不暴露新 URL)且不想重匹配 location,用 break。
调试与验证建议
正则容易出错,上线前务必验证:
- 用在线工具(如 regex101.com,选 PCRE 模式)测试表达式逻辑
- Nginx 开启
error_log /path/to/log notice;,配合rewrite_log on;(仅调试用,性能敏感环境禁用)可输出 rewrite 过程 - 用
curl -I检查响应头中的Location是否符合预期 - 注意浏览器缓存 301,测试时用
curl -v或隐身窗口


















