nginx重定向应优先用return替代rewrite,精确匹配用location=,多跳转用map集中管理,http/https与域名归一化分server块处理,禁用if+rewrite组合。

精简 Nginx 重定向规则的核心是:用更少、更确定、更易维护的指令替代大量分散或嵌套的 rewrite,优先使用 return,避免滥用 if + rewrite,同时把重复逻辑抽离为可复用结构。
用 return 替代 rewrite 实现单跳转
绝大多数单页面、单域名、全站跳转场景,return 301 是最轻量且无副作用的选择。它不触发 location 重匹配,不走正则引擎,也不依赖 flag 控制流程。
- 错误写法(冗余且易出错):
location /old { rewrite ^/old(.*)$ /new$1 permanent; } - 推荐写法(简洁明确):
location = /old { return 301 /new; }
若需保留参数,用return 301 /new$request_uri; - 注意加
=精确匹配,防止/old-page也被误捕获
合并同类跳转:用 map 模块统一管理路径映射
当存在 5 条以上固定路径跳转(如 /a → /x,/b → /y),硬编码多个 location 块会显著增加配置体积和维护成本。改用 map 指令集中定义映射关系,再配合一个通用 location 判断执行。
- 在
http块中定义:
default "";
/old-page "/new-page";
/contact "/about/contact";
/blog/archive "/posts";
}
- 在 server 块中统一处理:
if ($redirect_to) {
return 301 $redirect_to;
}
# 后续正常服务逻辑
}
- 优势:新增跳转只需改 map 表,无需动 location 结构;Nginx 启动时预编译 map,性能接近原生指令
剥离 HTTP→HTTPS 和域名归一化到独立 server 块
把协议跳转和主域名跳转混在主 server 块里,不仅逻辑混乱,还容易因顺序或条件判断引发循环跳转。正确做法是为每类“强制跳转”单独设立监听 80 端口的 server 块。
- HTTP 全站跳 HTTPS:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } - 非 www 跳 www:
server { listen 80; server_name example.com; return 301 https://www.example.com$request_uri; } - 关键点:每个 server 块只做一件事;
$host只用于已知可信域名,否则显式写死目标域名防开放重定向
删掉无意义的 if + rewrite 组合
Nginx 中 if 指令在 location 外不安全,在 location 内又极易引发隐式内部重定向。以下写法看似合理,实则隐患极大:
if (!-f $request_filename) {rewrite ^/(.*)$ /index.php?path=$1 last;
}
- 问题:if 在 location 中属于“伪指令”,行为不可预测;
last可能导致无限循环;!-f判断开销大且不精准 - 替代方案:
– 静态文件服务用try_files $uri $uri/ /index.php?path=$uri;
– 动态路由交由后端处理,Nginx 不参与路径逻辑判断











