HTTP 3xx 状态码表示客户端需要采取进一步操作来完成请求,通常用于资源重定向 或缓存验证。最常见的包括 301、302、303、307、308 以及 304。
301 Moved Permanently(永久重定向)
301 Moved Permanently 表示请求的资源已被永久移动到新的 URL,客户端应使用新地址访问。
适用常用有哪些?
- 域名迁移 :
http://old-domain.com→http://new-domain.com - HTTP 升级 HTTPS :
http://example.com→https://example.com - URL 结构重构 :
/old-path→/new-path - 合并重复页面:多个 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 请求

首次请求

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