2026.05.25 | youres | 14次围观
配置Nginx重定向时,很多人会纠结:rewrite和return到底用哪个?本文从性能、语法、场景三个维度彻底讲清楚两者的区别,帮你做出正确选择。
核心区别:一句话说清
return是直接返回,rewrite是正则匹配后改写。
简单重定向用return,复杂URL变换用rewrite。记住这句话就够用80%的场景。
return指令:简单粗暴高效
基本语法
return 状态码 [URL或文本];
return URL; // 默认302重定向常用示例
HTTP跳HTTPS(推荐return)
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}域名迁移
server {
listen 80;
server_name old.com;
return 301 https://new.com$request_uri;
}返回错误页面
location /admin {
return 403;
}return的优势
- 性能更好:不涉及正则匹配,直接返回响应
- 语法简单:一行代码搞定,可读性强
- 优先级明确:在server块中最早执行,不会被rewrite干扰
- 适合简单跳转:整个域名跳转、HTTP跳HTTPS、返回错误码
rewrite指令:正则匹配更灵活
基本语法
rewrite 正则 替换 [flag];
// flag可选值:
// last - 停止处理当前rewrite,重新搜索location
// break - 停止处理当前rewrite,直接返回
// redirect - 临时重定向(302)
// permanent - 永久重定向(301)常用示例
旧URL跳新URL(带正则捕获)
location /old {
rewrite ^/old/(.*)$ /new/$1 permanent;
}去掉URL末尾斜杠
rewrite ^/(.*)/$ /$1 permanent;根据路径重写到不同后端
location /api {
rewrite ^/api/v1/(.*)$ /api/v2/$1 last;
proxy_pass http://backend;
}rewrite的优势
- 支持正则表达式:可以匹配复杂URL模式
- 捕获组替换:$1、$2提取URL中的变量
- 多种flag控制:last、break控制后续处理流程
- 适合复杂变换:URL结构改造、路径重写、条件性跳转
性能对比:谁更快?
return更快。原因很简单:
return不执行正则匹配,直接返回HTTP响应rewrite需要编译正则、执行匹配、替换变量,开销更大
对于单次请求差异微乎其微,但高并发场景下return有明显优势。
场景选择指南
| 场景 | 推荐指令 | 示例 |
|---|---|---|
| 整站HTTP跳HTTPS | return | return 301 https://$host$request_uri; |
| 域名整体迁移 | return | return 301 https://new.com$request_uri; |
| 返回固定错误页 | return | return 403; |
| 旧路径跳新路径(固定) | return | return 301 /new-path; |
| URL正则模式跳转 | rewrite | rewrite ^/old/(.*)$ /new/$1 permanent; |
| 批量去掉斜杠 | rewrite | rewrite ^/(.*)/$ /$1 permanent; |
| 路径结构重组 | rewrite | rewrite ^/category/([0-9]+)/([a-z]+)$ /cat?id=$1&name=$2 last; |
| 条件性重定向 | rewrite+if | if ($arg_old) { rewrite ^ /new permanent; } |
常见陷阱
陷阱1:rewrite死循环
// 错误示例:无限循环
location / {
rewrite ^/test$ /test permanent; // 自己跳自己
}
// 正确做法:用break或last终止
location / {
rewrite ^/test$ /test break; // 或者换其他路径
}陷阱2:混淆last和break
last:停止当前rewrite处理,重新匹配location(适合重写到内部路径)break:停止所有rewrite处理,直接返回(适合重写到外部URL或静态文件)
陷阱3:return写在location里效率低
// 可行但不推荐
location / {
return 301 https://$host$request_uri; // 可以工作
}
// 推荐写法:直接写在server块
server {
listen 80;
return 301 https://$host$request_uri; // 优先执行,更高效
}最佳实践总结
- 能用
return解决的,不要用rewrite - 整站跳转、HTTP跳HTTPS、域名迁移 →
return 301 - URL正则替换、路径重组、批量模式匹配 →
rewrite rewrite用完记得加flag(permanent/redirect/last/break)- 生产环境改动前,先用
nginx -t检查语法
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论