301(永久重定向)和 302(临时重定向)都是 HTTP 重定向状态码,用于告知客户端资源的位置发生变化,但两者的语义、浏览器行为和适用场景有本质区别,核心差异如下:
1. 语义不同
301 Moved Permanently(永久重定向)
表示请求的资源已永久迁移到新 URL,原 URL 不再有效。服务器通过响应头Location告知新地址,客户端后续应直接使用新 URL 发起请求,无需再访问原 URL。302 Found(临时重定向)
表示请求的资源临时位于新 URL,原 URL 仍然有效(未来可能恢复使用)。服务器通过Location告知临时地址,客户端后续仍需使用原 URL 发起请求,不能假设新地址是永久的。
2. 浏览器/客户端行为不同
- 缓存处理:
301:浏览器会缓存重定向关系,后续对原 URL 的请求会直接跳转到新 URL(无需再向服务器确认),除非缓存被清除或服务器通过Cache-Control头禁用缓存。302:浏览器默认不缓存重定向关系,每次请求原 URL 时,都会先向服务器确认,再根据响应进行跳转(避免缓存临时地址导致后续请求错误)。- 请求方法变更:
301:标准规定,若原请求是POST,重定向后的请求方法可能被改为GET(部分浏览器遵循此行为)。302:早期 HTTP 规范允许浏览器将原POST请求改为GET进行重定向(可能导致数据丢失),因此后来新增了307(严格临时重定向)来强制保持原方法。
3. 适用场景不同
301适用场景:
资源的 URL 发生永久性变更,原地址废弃,需长期引导客户端使用新地址。例如:- 网站域名更换(如
http://old.com迁移到https://new.com)。 - 页面路径重构(如
http://example.com/blog/old永久改为http://example.com/articles/new)。 - HTTP 协议升级到 HTTPS(如
http://example.com永久重定向到https://example.com)。 302适用场景:
资源的 URL 仅临时变更,原地址仍可能使用,需临时引导客户端到新地址。例如:- 用户未登录时,访问需授权的页面(如个人中心),临时重定向到登录页。
- 网站维护期间,临时将所有请求重定向到维护通知页。
- 活动页面临时跳转(如促销活动结束后恢复原页面)。
总结对比表
维度 |
|
|
语义 |
资源永久迁移,原 URL 失效 |
资源临时迁移,原 URL 仍有效 |
缓存行为 |
浏览器缓存重定向关系 |
浏览器默认不缓存 |
后续请求地址 |
客户端应使用新 URL |
客户端仍需使用原 URL |
典型场景 |
域名更换、路径永久重构 |
未登录跳转、临时维护 |
注意:由于 302 可能导致请求方法被修改(如 POST 变 GET),实际开发中若需严格保持原方法的临时重定向,建议使用 307 Temporary Redirect(与 302 语义类似,但强制不改变请求方法)。