HTTP 3xx 重定向类状态码

HTTP 3xx 状态码表示客户端需要采取进一步操作来完成请求,通常用于资源重定向 或缓存验证。最常见的包括 301、302、303、307、308 以及 304。

301 Moved Permanently(永久重定向)

301 Moved Permanently 表示请求的资源已被永久移动到新的 URL,客户端应使用新地址访问。

适用常用有哪些?

  1. 域名迁移 :http://old-domain.com → http://new-domain.com
  2. HTTP 升级 HTTPS :http://example.com → https://example.com
  3. URL 结构重构 :/old-path → /new-path
  4. 合并重复页面:多个 URL 指向同一资源,保留一个规范地址。

例子 GET 请求 /api/301 请求

node 后端代码

当服务器返回 3xx 状态码时,必须在响应中包含 Location 头,浏览器会据此自动发起对新 URL 的请求。

js 复制代码
  // 301 永久重定向(GET → GET)
  app.get("/api/301", (req, res) => {
    try {
      res.status(301);
      res.set("Location", "/api/target"); // 设置重定向的目标URL
      res.end(); // 直接结束响应,不使用 send() 方法
    } catch (err) {
      console.log("error----");
      res.status(500).send(err.message);
    }
  });

首次请求

再次请求

可以看出 301 重定向默认会被浏览器缓存 ,即便响应中未包含 Cache-Control 或 Expires 头部。

例子 POST 请求 /api/301 请求

POST 请求会改为 GET 请求,并丢弃请求体

再次请求,不会缓存

302 Found(临时重定向,HTTP/1.0 遗留)

302 Found(旧称 Moved Temporarily)表示请求的资源被临时 移动到另一个 URI,客户端应使用新地址访问。但 HTTP/1.1 规范中,302 对重定向后的请求方法没有严格规定,导致实际实现中浏览器通常将 POST 改为 GET ,并可能丢失请求体。因此它被视为有歧义的状态码,现代 Web 开发推荐使用 303 或 307 替代。

303 See Other(临时重定向,强制使用 GET)

303 See Other 表示服务器要求客户端将当前请求重定向到另一个 URI,无论原始请求是什么方法,重定向后的请求必须使用 GET 方法 。它常用于 Post/Redirect/Get (PRG) 模式,防止表单重复提交。

  • 强制转为 GET :原始请求可以是 POST、PUT、DELETE 等,但重定向后的请求必须是 GET。
  • 临时性 :303 是临时重定向,浏览器默认不缓存(除非响应头明确指示缓存)。

示例 get 请求

可以看出再次请求,浏览器不会缓存。

首次请求

post 请求

可以看到原🧵 post 请求,重定向后,会改用 GET 请求

首次请求

307 Temporary Redirect(临时重定向,保持原始方法)

307 Temporary Redirect 表示请求的资源被临时移动到了另一个 URI,客户端必须继续使用原始请求方法 (如 POST 仍为 POST,PUT 仍为 PUT)向新地址发起请求。它是 302 Found 的现代化替代,消除了方法歧义。

  • 临时性 :重定向是暂时的,未来请求仍应使用原 URL,浏览器默认不缓存 (除非响应中显式设置 Cache-Control)。
  • 方法保持 :与 302(通常被浏览器转为 GET)不同,307 要求客户端严格保持原始 HTTP 方法。这意味着 POST、PUT、DELETE 等非 GET 请求重定向时,请求体和方法不会改变。

浏览器自动重定向 :当收到 307 时,浏览器会使用与原始请求相同的 HTTP 方法向 Location 中的地址发起新请求,并自动携带原请求体(对于 POST/PUT 等)。

示例 get 请求

可以看出 浏览器没有默认缓存。

首次请求

示例 post 请求

首次请求

重定向的地址,请求体会保留

308 Permanent Redirect(永久重定向,保持原始方法)

308 Permanent Redirect 表示请求的资源已被永久 移动到新的 URI,并且客户端必须继续使用原始请求方法 (如 POST 仍为 POST,PUT 仍为 PUT)向新地址发起请求。它是 301 的扩展,明确了方法保持的语义。

  • 永久性:资源的新位置长期有效,搜索引擎应更新索引,浏览器会缓存该重定向(后续请求直接访问新地址,不再请求原 URL)。
  • 方法保持 :与 301(通常被浏览器转为 GET)不同,308 要求客户端严格保持原始 HTTP 方法。POST、PUT、DELETE 等非 GET 请求重定向时,请求体和方法不会改变。
  • 缓存 :默认可被浏览器和代理缓存(除非响应中明确禁止缓存)。缓存时长由 Cache-Control 控制,若未指定则可能被客户端启发式缓存(通常很长)。

示例 get 请求

浏览器会自动缓存

示例 post 请求

首次请求

重定向链接 请求会保留请求体,且方法保留原样。

相关推荐
guslegend14 小时前
脚手架入门:必要性、核心功能与执行原理
前端·架构·node.js·脚手架·前端工程化
0+11118 小时前
Linux --应用层协议HTTP
网络·网络协议·http
To_OC1 天前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
HaipengYu1 天前
深度解密 OpenCode 2 插件加载机制:Dual-Version (V1/V2) 适配实战与官方文档的“隐形陷阱”
node.js
前端之虎陈随易2 天前
bm2,Node.js 与 Bun 项目部署新选择
node.js
小贺儿开发2 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
剑锋所指,所向披靡!3 天前
HTTP服务器的基本相关概念
服务器·网络协议·http
可乐鸡翅yeah_3 天前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
m0_738185823 天前
Flutter 鸿蒙化实战:http_proxy 适配 OpenHarmony,HTTP 代理
flutter·http·华为·harmonyos·鸿蒙
梦帮科技3 天前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php