307 Temporary Redirect
用法
307 Temporary Redirect 状态码表示目标资源位于另一个 URL。客户端向 Location 头中指定的 URL 发起新请求,且不允许更改请求方法。这与 302 状态码不同,后者允许客户端从 POST 切换到 GET。
当期望的行为是更改请求方法时,推荐使用 303 状态码作为替代。例如,将 POST 表单提交重定向到确认页面时,应使用 303 并跟随一次 GET。
客户端必须以完全相同的方法、头和消息体向新 URL 重复请求。服务器会正常处理被重定向的请求。由于 307 Temporary Redirect 并非持久性的,后续请求应仍使用原始 URL,并重新校验这一临时变更。
其永久性对应状态码是 308,它同样完整保留请求方法,但表明该移动是永久的,客户端应更新已存储的链接。
该响应默认不可缓存。要使重定向可缓存,需添加 Cache-Control 或 Expires 头。
当通过 Strict-Transport-Security 头或 HSTS 预加载列表声明了 HSTS 策略时,307 Temporary Redirect 状态码还可用作内部重定向。客户端利用该状态码在不联系服务器的情况下,从 HTTP 重定向到使用 HTTPS 的安全连接。
注意
浏览器在通过 HSTS 将 HTTP 升级到 HTTPS 时,会在开发者工具中生成 “307 Internal Redirect”。这种重定向完全在浏览器内部发生,不涉及任何网络请求。开发者工具中会出现 Non-Authoritative-Reason: HSTS 头。HTTP 与 HTTPS 之间的 307 重定向循环,表明 HSTS 与服务端重定向规则相冲突。请确保服务器仅在 HTTP 端口上进行重定向。
注意
303 会强制后续请求使用 GET,而不论原始方法为何,因此 303 是 POST 后重定向的标准做法。307 则保留原始方法和消息体。客户端会以相同的 POST/PUT/PATCH 重新发送到新 URL。
SEO 影响
Google 将 307 视为重定向目标即为首选 URL 的弱信号,这与作为强信号的 301/308 不同。Google 会索引源 URL 或目标 URL 之一。长期保留的 307 最终可能被视为永久重定向,因此永久性变更用 308 更为合适。
示例
客户端请求某个资源,由于该资源位于另一个位置,服务器返回 307 Temporary Redirect。
请求
GET /news.html HTTP/1.1
Host: example.com
响应
HTTP/1.1 307 Temporary Redirect
Location: http://example.com/breaking/news.html
代码参考
.NET
HttpStatusCode.TemporaryRedirect
Rust
http::StatusCode::TEMPORARY_REDIRECT
Rails
:temporary_redirect
Go
http.StatusTemporaryRedirect
Symfony
Response::HTTP_TEMPORARY_REDIRECT
Python3.5+
http.HTTPStatus.TEMPORARY_REDIRECT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_TEMPORARY_REDIRECT
Angular
@angular/common/http/HttpStatusCode.TemporaryRedirect