一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx Rewrite 规则中匹配规则如何写

时间:2026-08-11 08:52:49 编辑:袖梨 来源:一聚教程网

Nginx rewrite规则基于PCRE正则匹配URI,需加^$锚定、用捕获组$1引用、末尾?清空原参数;执行顺序为先location后rewrite,last重启匹配、break终止查找,不处理查询字符串本身。

Nginx 的 rewrite 规则本质是基于 PCRE 正则表达式(Perl Compatible Regular Expressions)进行 URL 匹配与重写,*不支持通配符 `直接匹配,必须用正则语法。写对匹配规则的关键在于:理解locationrewrite` 的执行顺序、正确使用捕获组与变量、避免常见陷阱。

rewrite 匹配规则怎么写(核心写法)

  1. rewrite 指令本身只处理 URI(不带域名和参数),且在 location 块内或 server 块顶层生效
  2. 匹配部分是纯正则表达式,常用符号:
    1. ^ 表示开头,$ 表示结尾(强烈建议加,避免误匹配)
    2. (.*)([^?]*) 捕获路径(注意:默认不匹配查询字符串 ?xxx
    3. $1, $2 引用捕获组;$args$query_string 保留原始参数
  3. 示例:把 /old/page/123/new/article?id=123
    rewrite ^/old/page/(d+)$ /new/article?id=$1? permanent;

    注意末尾的 ?:它会清空原始 query string,否则会自动拼接(如原链接带 ?t=1,不加 ? 就变成 /new/article?id=123&t=1

location 和 rewrite 的配合逻辑

  1. Nginx 先匹配 location,再在匹配到的 location 块里执行 rewrite
  2. rewrite 执行后,默认会重新发起内部跳转(即再次走 location 匹配),除非加 lastbreak
  3. 常用标志说明:
    1. last:重写后停止当前 location,重新搜索匹配新 URI 的 location(适合路径改写)
    2. break:重写后不再查找 location,直接处理当前块剩余指令(适合简单替换)
    3. redirect(302)或 permanent(301):外部重定向,浏览器地址栏会变

常见匹配场景写法

  1. 去掉多级目录前缀(如 /v1/api/xxx → /api/xxx

    location ^~ /v1/ {rewrite ^/v1(/.*)$ $1 break;}
  2. 强制 HTTPS + 去掉 www

    if ($host = 'www.example.com') {return 301 https://example.com$request_uri;}if ($scheme != 'https') {return 301 https://$host$request_uri;}
  3. 静态资源忽略 rewrite(推荐用 location 精确匹配)

    location ~* .(js|css|png|jpg|gif)$ {# 不写 rewrite,直接 serve 文件expires 1y;add_header Cache-Control "public, immutable";}

容易出错的细节

  1. rewrite不处理查询参数本身,只作用于 path 部分;想操作 ? 后内容,要用 $args 变量拼接
  2. iflocation 外可用,但在 location 内慎用(Nginx 最新不推荐嵌套 if)
  3. 正则中特殊字符如 ., ?, +, {, } 必须转义(.?
  4. 测试正则建议用在线工具(如 regex101.com),选 PCRE 模式,并开启 m(多行)和 g(全局)辅助调试

不复杂但容易忽略

热门栏目