HTTP 307 Temporary Redirect

严格的临时重定向:前往另一个 URL,并按原样重复发送请求。

HTTP 307 是什么意思

HTTP 307 Temporary Redirect 的行为与 302 类似,但额外保证一点:客户端必须以相同的方法和请求体向新 URL 重复该请求。被重定向的 POST 仍然是 POST——不会被悄悄转换为 GET。

浏览器也会在内部生成 307:当某个站点在 HSTS 预加载列表中时,浏览器会自行将 http:// 升级为 https://,并在开发者工具中显示“307 Internal Redirect”,而不会发出任何网络请求。

307 响应的常见原因

  • 一个 API 将 POST/PUT 请求临时重定向到另一个端点。
  • HSTS:浏览器在内部将 http:// 升级为 https://(在开发者工具中显示为 307)。
  • 负载削减或维护窗口期间,将写操作重新路由到备用端点。

开发者的最佳实践

  • 当被重定向的请求携带的请求体必须在跳转过程中保留时,使用 307。
  • 如果需要永久且保留方法的迁移,应改用 308。
  • 请记住客户端会重新发送完整的请求体——如果可以提前将客户端指向正确的 URL,应避免对超大上传使用 307。

示例响应

HTTP/1.1 307 Temporary Redirect
Location: https://api.example.com/v2/orders
Retry-After: 0

常见问题

302 和 307 有什么区别?

两者都是临时的,但 307 禁止更改请求方法——POST 会以 POST 的形式重复。而使用 302 时,浏览器历史上会转换为 GET。

为什么开发者工具会显示“307 Internal Redirect”?

浏览器自行将请求升级为了 HTTPS(HSTS),而没有联系服务器。这会显示为一个合成的 307。

307 有对应的永久版本吗?

有——308 Permanent Redirect:同样保留方法,但缓存和搜索引擎会将该迁移视为永久性的。