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

最新下载

热门教程

Nginx 中 Rewrite 规则如何编写与使用

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

Nginx rewrite规则本质是URL重写,通过rewrite指令配合正则表达式和flag(如last、break、redirect、permanent)实现路径修改或跳转,须置于server/location块中,慎用if块。

Nginx 的 rewrite 规则本质是 URL 重写,用于修改请求路径、跳转或内部重定向,核心靠 rewrite 指令配合正则表达式和标志位实现。

rewrite 指令的基本语法与位置

rewrite 必须写在 server、location 或 if 块中(不推荐在 if 中滥用),格式为:

rewrite <正则表达式> <替换目标> [<flag>];

  1. 正则表达式默认区分大小写,可用 ~* 表示不区分大小写匹配
  2. 替换目标支持变量(如 $1、$2 捕获组,$host、$request_uri 等内置变量)
  3. 常见 flag:last(内部重定向,结束当前 location 匹配后重新搜索;break(停止 rewrite 处理,不再执行后续 rewrite;redirect(302 临时跳转);permanent(301 永久跳转)

常用场景与写法示例

实际中多数需求可归为几类:

  1. 去掉 URL 中的 .php 后缀rewrite ^/(.*).php$ /$1 permanent;注意需配合 fastcgi_pass 正确处理,否则可能 404
  2. 强制 HTTPS 跳转if ($scheme = http) { rewrite ^ https://$host$request_uri? permanent; }更推荐用 return(性能更好):return 301 https://$host$request_uri;
  3. 统一入口(如前端 SPA)location / { try_files $uri $uri/ /index.html; }或显式 rewrite:rewrite ^(.*)$ /index.html last;(需确保 index.html 存在)
  4. 目录别名映射rewrite ^/old-path/(.*)$ /new-path/$1 break;使用 break 避免循环重写,且不触发 location 重匹配

调试与避坑要点

rewrite 容易因顺序、作用域或 flag 误用导致意外行为:

  1. rewrite 执行顺序从上到下,一旦匹配并带 lastredirect 等 flag,后续 rewrite 不再执行
  2. 避免在 if 块中大量使用 rewrite,Nginx 最新明确建议优先用 mapreturn 替代
  3. 测试正则时用在线工具(如 regex101)验证捕获是否准确,注意 Nginx 使用 PCRE,不支持 d 等简写,推荐用 [0-9]
  4. 启用 error_log /path/to/log notice; 可查看 rewrite 日志(需编译时开启 --with-debug)

替代方案:更推荐的写法

很多 rewrite 场景其实有更简洁、安全的替代方式:

  1. 跳转优先用 return:性能高、语义清晰,例如 return 301 https://$host$request_uri;
  2. 静态文件路由用 try_files:比 rewrite 更高效,如 SPA 路由、多级 fallback
  3. 复杂逻辑用 map 预定义变量:适合基于 host、user-agent 等条件做分流,避免嵌套 if
  4. URL 参数处理尽量在应用层完成,Nginx 仅做路径层面干预

rewrite 功能强大但需谨慎使用,理解其执行时机和 flag 差异是关键。简单跳转用 return,路径改写用 rewrite + break/last,复杂逻辑尽量下沉或换方案。

热门栏目