Nginx 的重定向规则

我之前写过一篇文章(Nginx location 匹配规则) 介绍过 Nginx 的 location 匹配规则、proxy_pass 路径拼接替换规则。这两类配置逻辑最大的特点就是规则隐晦,但整体知识点集中,逻辑简单。

而今天要讲解的 Nginx 重定向规则,不但有部分隐藏逻辑、内容复杂,而且正则表达式是必备前置知识,整体上更难。笔者当年也花了不少时间才整理清楚。

Nginx 中实现地址重定向、URL 改写跳转,主要依靠两类指令:return 与 rewrite。

一、return 指令

return 仅负责直接返回状态码 + 跳转地址,不会对原始 URL 做复杂的截取和替换,适合简单固定跳转、协议升级、域名迁移、非法请求拦截等场景。

1. return 基础语法

复制代码
# 格式1:仅返回状态码
return 状态码;

# 格式2:状态码(默认为302) + 跳转URL(常用)
return 状态码 目标URL;

2. 配置示例

return 的语法简单,只需要通过几个示例就能明白。

示例 1:HTTP 强制跳转 HTTPS,永久重定向

复制代码
location / {
    return 301 https://$host$request_uri;
}

示例 2:永久迁移至新域名

复制代码
server {
    listen 80;
    server_name old.com;
    return 301 https://new.com$request_uri;
}

示例 3:非法路径直接拦截

复制代码
location ~ /inner {
    return 403;
}

3. return 特点

  1. 优先级高,一旦执行 return,当前请求后续所有 Nginx 配置全部终止;
  2. 不支持正则截取、路径改写,只能直接跳转或拦截;
  3. 性能损耗极低,静态跳转场景优先推荐使用 return,不建议滥用 rewrite。

二、rewrite 指令

rewrite 就是 Nginx 的动态 URL 改写工具,能力很强,但是规则也相对复杂。

rewrite 依赖正则表达式匹配请求路径,支持截取分组、路径裁剪、参数拼接、循环改写,专门用来解决复杂场景。

1. rewrite 语法

复制代码
rewrite 正则匹配规则 替换后的URL [flag标记];
  • 匹配规则:支持正则表达式,和 location ~ 正则语法完全一致;
  • 替换 URL:支持普通字符串、正则分组捕获(1 2)、Nginx 内置变量;
  • flag 标记:控制改写执行逻辑,是 rewrite 最复杂的部分。

2. Flag 标记

匹配和替换逻辑相对明确,flag 标记则是 rewrite 容易踩坑的地方,不同标记决定改写后请求的走向:

  • 无标记:顺序执行当前 location 中的全部 rewrite,然后重新发起一轮全局 location 匹配;
  • last:立即结束当前 location 后续逻辑,重新发起一轮全局 location 匹配,继续处理改写后的新 URL;
  • break:改写 URL 后,不再重新匹配 location,直接使用改写后的 URL 执行当前 location 的后续逻辑;
  • redirect:请求立即结束,返回 302 临时重定向;
  • permanent:请求立即结束,返回 301 永久重定向,浏览器缓存跳转规则。

对于浏览器的感受来说:

  • 无标记、last 和 break 为服务端内部改写路径,浏览器地址栏不变。
  • redirect / permanent:由浏览器参与跳转,地址栏发生变化,属于外部显性跳转;浏览器会发起一次额外请求访问重定向后的资源,性能上不如 last / break。

3. 配置示例

示例 1:伪静态改写(动态 URL 转静态地址)

/detail?id=123 改写为 /detail/123.html

复制代码
rewrite ^/detail/(\d+)\.html$ /detail?id=$1 break;

示例 2:临时页面跳转

复制代码
rewrite ^/about$ /about-us redirect;

示例 3:rewrite 多次执行(无标记)

复制代码
location /test {
    rewrite ^/test/a /1;
    rewrite ^/1 /2;
}

无标记执行流程:

  • 第一条 rewrite 改成 /1
  • 不会立刻跳转,继续往下执行
  • 第二条 rewrite 继续匹配,改成 /2
  • 全部执行完毕后,用新 URL 重新全局匹配 location

示例 4:添加 last 标记

复制代码
location /test {
    rewrite ^/test/a /1 last;
    rewrite ^/1 /2;
}

last 标记执行流程:

  • 匹配命中,改成 /1
  • 遇到 last:立即终止当前 location 所有逻辑
  • 后续 rewrite ^/1 /2 不会执行立刻
  • 用新 URL 重新全局匹配 location

4. 防止死循环

  • 无标记 / last 模式下,会触发重新查找 location;Nginx 为防止 rewrite 死循环,内置全局计数器,每触发一次"重新查找 location」",计数器自增 1。
  • 最多仅允许 10 次内部 rewrite 操作,超出限制直接返回 500 错误。
相关推荐
前端程序猿i20 小时前
Nginx 教程:从入门到能上线
运维·nginx
明辰之林20 小时前
Nginx 1.26.2 → 1.30.2 升级指南(离线环境)
nginx
小云小白1 天前
企业抗量子落地指南(一)全链路抗量子 TLS1.3 落地指南(浏览器 → Nginx → SpringBoot)
spring boot·nginx·抗量子通信
tobias.b1 天前
JumpServer4\.10\.16离线部署\+外部Nginx反向代理 解决30分钟空闲断开WebSocket超时(延长10天)
运维·websocket·nginx
衫水1 天前
Windows Server Nginx 代理企业内网 API 偶发超时处理与保活 SOP(20260608))
运维·windows·nginx
是一个Bug1 天前
Nginx 与 API Gateway:从“小区门卫”到“商场总服务台”
运维·nginx·gateway
锋行天下2 天前
中小项目高可用,真的需要K8s吗?从单机备份到企业级架构的完整思考
后端·mysql·nginx
辰_砂3 天前
国产服务器操作系统编译nginx生成rpm包
运维·nginx
finyouIT4 天前
限制国外ip访问网站
nginx
qq_312920114 天前
高并发防护:Nginx 流量控制
nginx