nginx rewrite指令基于pcre正则实现url重写,语法为rewrite regex replacement [flag];括号定义捕获组($1、$2等),^和$确保严格路径匹配,redirect/ permanent触发302/301跳转,query string需显式处理(如?$args保留参数)。

Nginx 的 rewrite 指令支持 PCRE 正则表达式,可以捕获 URL 中的路径片段,并在重定向目标中引用这些捕获组(用 $1、$2 等表示)。关键在于:正则写对、括号正确分组、重定向时用 redirect 或 permanent 标志,且目标 URL 中能安全引用捕获内容。
基础语法与捕获组写法
rewrite 后跟三个部分:正则模式、替换目标、标志。括号 () 用于定义捕获组,Nginx 会按从左到右顺序编号为 $1、$2…
-
rewrite ^/article/(\d+)$ /post?id=$1 permanent;匹配/article/123→ 重定向到/post?id=123 -
rewrite ^/user/([a-zA-Z0-9]+)/profile$ /u/$1 permanent;匹配/user/john/profile→ 重定向到/u/john - 注意:正则开头的
^和结尾的$表示严格匹配整个 URI 路径(不含 query string),避免误匹配
处理带查询参数的原始请求
rewrite 默认不操作 query string(即 ?key=val 部分)。如果希望保留原参数,末尾加 ?;如需覆盖或拼接新参数,显式写出:
-
rewrite ^/old/(.*)$ /new/$1?ref=nginx permanent;将/old/path?a=1→/new/path?ref=nginx(原参数被丢弃) -
rewrite ^/old/(.*)$ /new/$1?$args permanent;保留原始参数:/old/x?k=v→/new/x?k=v -
rewrite ^/old/(.*)$ /new/$1?src=legacy&$args permanent;合并参数(注意&是配置中写法,实际生效为&)
在 location 块中使用 rewrite 的注意事项
rewrite 放在 location 内时,匹配的是该 location 已截断后的 URI(即去掉 location 前缀后剩余部分)。此时捕获应基于这个“局部路径”:
-
location /blog { rewrite ^/blog/(.*)$ /articles/$1 permanent; }请求/blog/2024/hello→ 匹配/blog/(.*),捕获2024/hello→ 跳转到/articles/2024/hello - 若想匹配完整原始 URI,改用
server级 rewrite,或用location ~ ^/blog/配合完整正则 - rewrite 执行后默认发起内部重写(不跳转),加
redirect或permanent才触发 HTTP 302/301 响应
调试技巧与常见坑
正则不生效?跳转后参数乱码?试试这些:
- 开启 Nginx debug 日志:
error_log /var/log/nginx/error.log debug;,查看 rewrite 匹配过程 - 特殊字符要转义:点号
.写成\.,斜杠/在正则中无需转义(但路径分隔符本身是 literal) - 中文或 UTF-8 路径需确保 Nginx 编译时支持 PCRE UTF,且系统 locale 设置正确;否则建议用
.*或[^/]+宽松匹配 - 避免循环重定向:检查 rewrite 目标是否又被同一规则再次匹配,可加条件判断或用
break终止后续 rewrite











