HTTP 3xx 重定向类状态码

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

301 Moved Permanently(永久重定向)

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

适用常用有哪些?

  1. 域名迁移http://old-domain.comhttp://new-domain.com
  2. HTTP 升级 HTTPShttp://example.comhttps://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-ControlExpires 头部。

例子 POST 请求 /api/301 请求

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

再次请求,不会缓存

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

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

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

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

  • 强制转为 GET :原始请求可以是 POSTPUTDELETE 等,但重定向后的请求必须是 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 请求

首次请求

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

相关推荐
丑过三八线1 小时前
npm 私有仓库找不到包的解决方案
前端·npm·node.js
代码中介商3 小时前
HTTP 完全指南(一):请求与响应报文结构深度详解
网络·网络协议·http
米丘3 小时前
HTTP 强缓存 和 协商缓存 (浏览器缓存)
http·node.js·浏览器
lunzi_08265 小时前
《图解HTTP》--第6章-HTTP首部
网络·网络协议·http
BINGCHN5 小时前
CVE-2026-49975(HTTP/2 Bomb 远程拒绝服务漏洞)
网络·网络协议·http·cve
无风听海5 小时前
深入解析 ASP.NET Core 中的 Request.Cookies:从 HTTP 协议到加密存储与执行时序
后端·http·asp.net
Geoking.7 小时前
SSH 一断 Node 服务就挂?排查与解决方案记录
运维·node.js·ssh
jike88ai8 小时前
Windows版Claude Code安装与API对接教程(附常见问题解决)
windows·gpt·node.js·claude·claudecode·88api
开发者联盟league8 小时前
docker登录失败解决方法。http: server gave HTTP response to HTTPS client
http·docker·https