Nginx Rewrite优化核心是减少匹配与分支:用return替代rewrite permanent;重定向放server顶部;用try_files替代if+rewrite;静态跳转用map预计算;收敛作用域,禁用嵌套if和链式rewrite;避免灾难性正则。

在高并发、低延迟要求的生产环境中,Nginx Rewrite 规则的开销必须压到最低——核心不是“怎么写更多规则”,而是“怎么让 Nginx 少做匹配、少进分支、早返回”。
用 return 替代 rewrite permanent 做重定向
rewrite 指令哪怕只写 rewrite ^ /new permanent;,也会触发 PCRE 正则引擎加载、编译和匹配流程;而 return 是纯指令跳转,无任何运行时解析开销。
- 正确写法:
return 301 https://$host$request_uri;(保留完整路径和参数) - 重定向逻辑应放在
server块最顶部,早于所有 location 匹配,跳过 root 解析、缓存检查等环节 - 避免加
?清空 query string,除非业务明确需要;加 ? 可能破坏前端路由 hash 或带参跳转
用 try_files 替代 if + rewrite 处理静态回退
if 块在 location 中会强制每次请求都做文件存在性判断(两次磁盘 I/O),而 try_files 是原子操作,由内核级路径查找优化,语义清晰且性能更高。
- 低效写法:
if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?$1 last; } - 高效写法:
try_files $uri $uri/ /index.php?$args; - 适用于 SPA 路由、PHP 入口统一、静态资源兜底等常见场景
用 map 预计算替代大量 if + rewrite 静态跳转
当有几十上百条固定路径映射(如旧 URL → 新 URL)时,逐条 if 判断 + rewrite 会带来严重正则匹配压力;map 在 Nginx 启动时就构建哈希表,查询为 O(1),完全规避运行时正则开销。
- 在
http块中定义:map $request_uri $redirect_target { "/old/a" "https://example.com/new/x"; "/old/b" "https://example.com/new/y"; default ""; } - 在
server块中使用:if ($redirect_target) { return 301 $redirect_target; } - 不支持正则匹配,但对静态映射是目前最轻量、最可扩展的方案
收敛作用域,禁用嵌套与循环
rewrite 的执行成本随作用域扩大而指数上升:server 级 rewrite 全局生效,location 级已收敛,if 嵌套则每次必进条件判断——应严格限制层级与范围。
- 域名统一、协议跳转等通用逻辑放 server 顶层,用 return 快速响应
- 业务路径重写(如
/api/v1/→/v2/)收敛到对应location /api/块内 - 严禁多层 if 嵌套;避免 rewrite 链式调用(如 A→B→C),Nginx 默认最多执行 10 次 rewrite,超限直接 500
- 关闭无意义正则:避免
.*、.+、嵌套量词,防止回溯灾难拖慢整个 worker 进程



















