Sunday面试指南

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 跳转。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历