0

Nginx rewrite和return区别详解:重定向到底该用哪个?

2026.05.25 | youres | 14次围观

配置Nginx重定向时,很多人会纠结:rewritereturn到底用哪个?本文从性能、语法、场景三个维度彻底讲清楚两者的区别,帮你做出正确选择。

核心区别:一句话说清

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跳HTTPSreturnreturn 301 https://$host$request_uri;
域名整体迁移returnreturn 301 https://new.com$request_uri;
返回固定错误页returnreturn 403;
旧路径跳新路径(固定)returnreturn 301 /new-path;
URL正则模式跳转rewriterewrite ^/old/(.*)$ /new/$1 permanent;
批量去掉斜杠rewriterewrite ^/(.*)/$ /$1 permanent;
路径结构重组rewriterewrite ^/category/([0-9]+)/([a-z]+)$ /cat?id=$1&name=$2 last;
条件性重定向rewrite+ifif ($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辅助作者原创,未经许可,转载请保留原文链接。

发表评论
881文章数 0评论数
作者其它文章