return用于简单重定向,语法为return状态码url,适合固定跳转;rewrite支持正则匹配与替换,通过flag控制跳转或内部重写,适用于路径解析和参数重组。

在 Nginx 中,return 和 rewrite 都能实现跳转,但它们定位不同、适用场景不同、写法和效果也明显区别。配置前先明确:要的是“客户端可见的跳转”(重定向),还是“服务端内部路径变更”(重写)。
return 指令:简单直接的重定向
return 是最轻量、最高效的方式,适合固定跳转、协议切换、非法请求拦截等场景。它不走正则匹配,不依赖捕获组,直接返回状态码 + 目标地址。
- 语法简洁:
return 状态码 URL;(状态码可省略,默认 302) - 常用组合:
-
return 301 https://$host$request_uri;—— 强制 HTTP → HTTPS,保留完整路径和参数 -
return 301 https://new-domain.com$request_uri;—— 域名迁移,路径不变 -
return 403;或return 444;—— 拒绝访问,不返回任何响应体
-
- 注意:
$request_uri包含路径和查询参数(如/a/b?x=1&y=2),比$uri更完整;$host是请求头中的 Host 字段值,安全可靠
rewrite 指令:带正则和逻辑的灵活重写/跳转
rewrite 的核心能力是“匹配 + 替换”,配合 flag 控制行为。它适合需要提取路径片段、按条件改写、或内部转发的场景。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 基本语法:
rewrite 正则 替换目标 flag; - 关键点:
- 正则以
^开头、$结尾更安全,避免误匹配(如^/old/(.*)$) - 用
(...)捕获内容,通过$1、$2引用(如rewrite ^/user/(\d+)$ /api/v1/users/$1 break;) - flag 决定后续动作:
-
permanent→ 返回 301,客户端跳转(对外可见) -
redirect→ 返回 302,临时跳转 -
last→ 内部重写,新 URI 重新匹配 location(地址栏不变) -
break→ 重写后停止当前块内后续 rewrite,不重新匹配 location
-
- 正则以
- 示例:
- 外部跳转:
rewrite ^/blog/(.*)$ https://blog.example.com/$1 permanent; - 内部改写:
rewrite ^/api/(.*)$ /v2/api/$1 last;(之后由新 location 处理)
- 外部跳转:
location 块中怎么放 return 和 rewrite
两者都可出现在 server 或 location 块里,但位置影响执行顺序和作用范围。
-
return在 location 中优先级最高,一旦命中立即返回,后续指令不执行 -
rewrite默认在 location 入口处执行,若需条件触发,常配合if(但注意:if 在 location 中有局限,不推荐用于复杂判断) - 典型结构:
location /old/ { return 301 /new$request_uri; } location /admin/ { alias /var/www/admin/; try_files $uri $uri/ /admin/index.html; } location ~ ^/user/(\d+)$ { rewrite ^/user/(\d+)$ /api/user?id=$1 break; proxy_pass http://backend; }
选哪个?看实际需求
不需要正则提取、URL 固定、追求性能 → 用 return;需要路径解析、参数重组、或内部转发 → 用 rewrite。
小提醒: 尽量避免在同一个 location 中混用多个 rewrite;永久跳转优先用 301;测试阶段可用 302 避免缓存干扰;所有跳转建议带上 $request_uri 保证参数不丢失。










