Nginx rewrite规则基于PCRE正则匹配URI,需加^$锚定、用捕获组$1引用、末尾?清空原参数;执行顺序为先location后rewrite,last重启匹配、break终止查找,不处理查询字符串本身。
Nginx 的 rewrite 规则本质是基于 PCRE 正则表达式(Perl Compatible Regular Expressions)进行 URL 匹配与重写,*不支持通配符 `直接匹配,必须用正则语法。写对匹配规则的关键在于:理解location和rewrite` 的执行顺序、正确使用捕获组与变量、避免常见陷阱。
rewrite 指令本身只处理 URI(不带域名和参数),且在 location 块内或 server 块顶层生效
^ 表示开头,$ 表示结尾(强烈建议加,避免误匹配)(.*) 或 ([^?]*) 捕获路径(注意:默认不匹配查询字符串 ?xxx)$1, $2 引用捕获组;$args 或 $query_string 保留原始参数/old/page/123 → /new/article?id=123rewrite ^/old/page/(d+)$ /new/article?id=$1? permanent;
注意末尾的 ?:它会清空原始 query string,否则会自动拼接(如原链接带 ?t=1,不加 ? 就变成 /new/article?id=123&t=1)
location,再在匹配到的 location 块里执行 rewrite
rewrite 执行后,默认会重新发起内部跳转(即再次走 location 匹配),除非加 last 或 break
last:重写后停止当前 location,重新搜索匹配新 URI 的 location(适合路径改写)break:重写后不再查找 location,直接处理当前块剩余指令(适合简单替换)redirect(302)或 permanent(301):外部重定向,浏览器地址栏会变去掉多级目录前缀(如 /v1/api/xxx → /api/xxx)
location ^~ /v1/ {rewrite ^/v1(/.*)$ $1 break;}
强制 HTTPS + 去掉 www
if ($host = 'www.example.com') {return 301 https://example.com$request_uri;}if ($scheme != 'https') {return 301 https://$host$request_uri;}
静态资源忽略 rewrite(推荐用 location 精确匹配)
location ~* .(js|css|png|jpg|gif)$ {# 不写 rewrite,直接 serve 文件expires 1y;add_header Cache-Control "public, immutable";}
rewrite不处理查询参数本身,只作用于 path 部分;想操作 ? 后内容,要用 $args 变量拼接if 在 location 外可用,但在 location 内慎用(Nginx 最新不推荐嵌套 if)., ?, +, {, } 必须转义(.?)m(多行)和 g(全局)辅助调试不复杂但容易忽略