一、什么是 Nginx 里的重定向

原笔记把这部分放在“rewrite 功能”章节里,但开头先说明了一个更大的背景:
重定向也叫 URL 重定向、URL 改写。

常见需求包括:

  • http 跳到 https
  • 新老域名互相跳转
  • 按客户端类型跳转到移动端或 PC 端
  • 调整 URL 结构做伪静态

而在这些场景里,最简单直接的手段之一就是 return

二、return 指令的两种基本写法

原笔记对 return 给出了两种格式:

return code URL;

表示:

  • 返回一个状态码
  • 同时给出新的 URL

另一种是:

return code;

表示:

  • 只返回指定状态码

原笔记还指出,return 可以放在:

  • server
  • location
  • if

这也是它非常灵活的原因。

三、案例一:把一个域名直接跳转到另一个网站

原笔记的第一个案例是:

  • 域名:rewrite.oldboylinux.cn
  • 访问后直接跳转到百度

配置如下:

server {
  listen 80;
  server_name rewrite.oldboylinux.cn;
  return 301 http://www.baidu.com;
}

这个配置的意思非常直接:

  • 只要命中这个 server
  • 就不再进入普通站点逻辑
  • 直接返回 301 和新的 Location

原笔记用 curl -Lv 验证后,能清楚看到:

  • 先返回 HTTP/1.1 301 Moved Permanently
  • 再根据 Location 去请求新的地址

这就是标准的域名跳转流程。

四、案例二:访问 /admin/ 时直接返回 403

原笔记的第二个案例把 return 放到了 location 中,用来拦截后台目录:

server {
  listen 80;
  server_name rewrite.oldboylinux.cn;
  root /app/code/rewrite;

  error_log /var/log/nginx/rewrite-error.log notice;
  access_log /var/log/nginx/rewrite-access.log main;

  location / {
    index index.html;
  }

  location /admin/ {
    return 403;
  }
}

配套测试文件如下:

mkdir -p /app/code/rewrite/admin
echo rewrite index > /app/code/rewrite/index.html
echo admin index > /app/code/rewrite/admin/index.html

测试结果是:

  • 访问根目录时返回正常首页
  • 访问 /admin/ 时直接返回 403 Forbidden

这个案例说明,return 不只是做跳转,也非常适合做简单的访问拒绝。

五、为什么 return 适合做简单控制

从原笔记两个案例可以看出,return 的最大特点是:

  • 简单
  • 直接
  • 不需要复杂正则

因此它特别适合以下类型的需求:

  • 老域名跳到新域名
  • 某个 URI 直接禁止访问
  • 某些条件下直接返回状态码
  • http -> https 的基础跳转

原笔记里也提到,后续 HTTPS 章节里还会继续讲 HTTP 到 HTTPS 的跳转场景。

六、和 rewrite 相比,什么时候优先考虑 return

虽然这一章后面还会讲 rewrite,但从原笔记的编排顺序也能看出来:

  • 如果只是简单跳转到一个固定新地址
  • 或者直接返回某个状态码

那通常优先考虑 return,因为它比 rewrite 更直接、更容易读懂。

只有在你需要:

  • 基于 URI 做正则匹配
  • 保留原路径的一部分
  • 做更复杂的改写逻辑

时,才更适合使用 rewrite

七、小结

return 可以理解成 Nginx 里最直接的“终止并给结果”的指令。
原笔记这两个案例已经覆盖了它最常见的两个用途:

  • return 301 新地址; 用于跳转
  • return 403; 用于拦截

当需求足够简单时,优先用 return,往往比一上来就写复杂 rewrite 更清晰。