HTTP 301、302、307、308 有什么区别?重定向后请求方法会变吗?
🧑💻 面试官:301 和 302 有什么区别?
🙋♂️ 我:一个永久,一个临时。
🧑💻 面试官:POST 提交之后收到重定向,新地址一定还会收到 POST 吗?
🙋♂️ 我:不一定,可能变成 GET。
🧑💻 面试官:如果必须保留方法和请求体,该用哪个状态码?保留 POST 又会带来什么风险?
重定向看两条轴:地址是否永久迁移,以及后续请求是否必须保留方法。
面试速答(60 秒版)
301 表示永久迁移,302 表示临时转向。出于历史兼容,它们允许客户端把原来的 POST 改为 GET,不能依赖它们保留 POST 请求体。
307 是临时重定向,308 是永久重定向;客户端自动跟随时不能改变请求方法,需要保留相应请求内容。若提交完成后想让浏览器去读取一个结果页,常用 303,而不是强行再提交一次。
永久和临时也会影响缓存及搜索引擎对地址迁移的理解。选择前要确认新目标、客户端支持、认证信息和循环风险。
保留方法不等于业务恰好执行一次。写操作是否已经发生、重放是否安全,仍要靠接口语义和幂等机制判断。

知识点详解:一次跳转,可能改变的不只是地址
先问旧地址还会不会回来
假设文章从 /old-guide 永久搬到 /new-guide,301 或 308 能表达长期迁移。临时维护时转去备用页面,302 或 307 更符合意图。
这影响的是地址关系,不是只影响浏览器地址栏。搜索引擎会把永久重定向作为新目标成为规范地址的信号;这不等于立刻收录,也不承诺流量不变。
临时切换没必要急着宣告永久。永久迁移则应尽量直接到最终目标,避免多跳和循环。
再问原请求的方法能不能变化
把四个状态码放在一起,就比较容易记。
| 状态码 | 地址关系 | 自动跟随后方法的要求 |
|---|---|---|
| 301 | 永久 | POST 可能改为 GET |
| 302 | 临时 | POST 可能改为 GET |
| 307 | 临时 | 不得改变方法 |
| 308 | 永久 | 不得改变方法 |
这里不是说 301、302 会把任何方法都无条件改成 GET。对于方法保留有明确要求的接口,别靠历史行为碰运气。
提交后看结果,和换地址继续提交不一样
假设表单已经成功保存。此时响应 303 并指向结果页,是让用户接下来读取结果,避免直接刷新原提交页又提交一次。它不是把 POST 换个地址重新执行。
如果服务尚未处理写请求,只是明确告诉客户端去另一个入口提交,307 或 308 更符合保留方法的意图。但要考虑请求体能否重放、跨域是否允许、认证信息是否继续发送。
服务已经完成写入却把客户端导向另一个写入口,会制造重复处理风险。状态码无法替你判断业务有没有执行。
不要把所有 3xx 都当成页面跳转
304 用于条件请求:表示缓存的表示仍可使用,不是通过 Location 把浏览器送去另一个页面。
自动跳转还有次数限制、协议和安全检查。服务器返回 Location,也不保证所有客户端会跟随。
上线迁移时至少测试普通 GET、写请求、查询参数、跨域和旧链接;看实际方法、目标和响应,不要只看页面最后能打开。
本题机制参考:HTTP 语义 RFC 9110、MDN 重定向、Google 地址迁移。
面试官继续追问
308 比 301 一定更好吗?
不是。需要保留方法时 308 更明确;普通页面迁移还要结合客户端、服务配置和测试选择。
302 可以完全不缓存吗?
不能只靠状态码判断。还需要检查响应缓存头、缓存实现和实际行为。
重定向能保证写请求不重复吗?
不能。写入发生的阶段和重放机制决定风险,必要时提供业务幂等保障。
面试速记卡
- 301/308:永久;302/307:临时。
- 301/302:POST 可能转 GET,不依赖它们保留请求体。
- 307/308:自动跟随不能改变方法。
- 303:提交后读取结果,和继续提交分开。
- 304:条件缓存响应,不是 Location 跳转。
公司面试真题
这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。
浏览公司面试真题 →