HTTPQUERY
English

302 Found

用法

收到 302 Found 状态码时,客户端明白所请求的资源已临时移动。客户端发起第二次请求即可在新位置获取该资源。相比 301,这种做法更简单,因为客户端无需更新内部链接。

注意

出于向后兼容的考虑,客户端在重定向时被允许将请求方法从 POST 改为 GET。为消除歧义,服务器可改用其他状态码。303 状态码表示重定向必须使用 GET 方法,而 307 状态码则要求保留原始方法。

触发 302 响应的常见情形包括:HTTP 升级到 HTTPS(通常用 301 更合适)、URL 规范化(末尾斜杠)、A/B 测试、基于地理位置的内容路由,以及临时维护重定向。

注意

302 是一次成功的重定向,而非错误。服务器找到了资源,并将客户端引导到当前位置。要解决非预期的 302 重定向:确认该重定向是有意为之,若资源为永久移动则改用 301,并检查 CMS 设置或 .htaccess 中是否存在无意添加的规则。

可缓存性

302 响应默认不可缓存。与 301 和 308 不同,302 需要显式的 Cache-Control 或 Expires 头才能被缓存存储。

SEO 影响

Google 将 302 视为重定向目标即为首选 URL 的弱信号,这与作为强信号的 301 不同。Google 会处理源 URL 或目标 URL 之一。长期保留的 302 最终可能被视为永久重定向,因此永久性变更用 301 更为合适。

示例

客户端请求一个临时移动的资源。服务器指明新位置,并提供一段相关消息供客户端展示。

请求

GET /news.html HTTP/1.1
Host: example.com

响应

HTTP/1.1 302 Found
Location: http://example.com/testing/news.html
Content-Type: text/html
Content-Length: 167

<h1>The Newsfeed has moved</h1>
<body>
The site is under development and the newsfeed has
temporarily moved to
<a href=/testing/news.html>here</a>.
</body>

代码参考

.NET

HttpStatusCode.Found

Rust

http::StatusCode::FOUND

Rails

:found

Go

http.StatusFound

Symfony

Response::HTTP_FOUND

Python3.5+

http.HTTPStatus.FOUND

Java

java.net.HttpURLConnection.HTTP_MOVED_TEMP

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_MOVED_TEMPORARILY

Angular

@angular/common/http/HttpStatusCode.Found