状态码概述
- 正式名称:
302 Found
(在早期 HTTP/1.0 中也称 “Moved Temporarily”) - 含义:服务器告诉客户端,请求的资源已临时移动到另一个 URI,客户端应按照响应头中的 Location 字段指示的地址重新发起请求。由于是临时的,客户端以后仍应继续使用原始 URL 进行请求,而不是永久更新书签或链接。
1. 响应结构
HTTP/1.1 302 Found
Location: https://example.com/new-page
Content-Type: text/html; charset=UTF-8
<html>…</html>
- **Location**:必需字段,给出新的临时 URL。
- **实体内容**(可选):通常包含一段简短的超链接说明,帮助不支持自动重定向的客户端手动跳转[[4]]。
### 2. 客户端行为
| 请求方法 | 浏览器实现(常见) | RFC 7231 规范 |
|----------|-------------------|---------------|
| GET / HEAD | 自动跟随 `Location`,发起新的 GET/HEAD 请求 | 必须自动重定向 |
| POST(或其他非 GET/HEAD) | 大多数浏览器仍会自动改为 GET 并重定向(等同于 303),但规范要求 **不** 自动重定向,除非得到用户确认[[5]][[6]] |
> 由于浏览器实现与 RFC 规范不完全一致,后来的 **303 See Other** 与 **307 Temporary Redirect** 被引入,以明确在不同请求方法下的期望行为[[7]]。
### 3. 缓存与有效期
- 302 本身默认 **不缓存**,只有在响应头中显式设置 `Cache‑Control` 或 `Expires` 时才可能被缓存[[8]]。
- 因为是临时重定向,搜索引擎通常不会把链接权重(“链接果汁”)转移到新 URL,SEO 影响相对较小,但频繁或错误使用仍可能导致抓取效率下降[[9]][[10]]。
### 4. 常见使用场景
1. **页面维护或临时迁移**:网站在升级期间把旧页面临时指向维护页面。
2. **登录后跳转**:用户访问受保护资源,服务器返回 302 并把 `Location` 指向登录页面,登录成功后再重定向回原地址。
3. **A/B 测试或地域分流**:根据用户属性临时把请求导向不同的实验页面。
### 5. 与其他重定向状态码的区别
| 状态码 | 含义 | 是否永久 | 方法处理 |
|--------|------|----------|----------|
| **301** | Moved Permanently | 永久 | 保持原请求方法 |
| **302** | Found / Moved Temporarily | 临时 | 浏览器常把非 GET/POST 改为 GET(规范不要求) |
| **303** | See Other | 临时 | 必须使用 **GET** 访问 `Location` |
| **307** | Temporary Redirect | 临时 | 必须保持原请求方法(如 POST) |
| **308** | Permanent Redirect | 永久 | 必须保持原请求方法 |
### 6. 实际代码示例(常见语言)
```php
// PHP 示例:返回 302 重定向
header('Location: https://example.com/new-page');
exit;
7. 注意事项
- 避免循环重定向:确保新 URL 不再返回 302,否则会导致浏览器报错。
- 明确语义:如果资源已永久迁移,请使用 301;如果仅在特定情境下临时切换,请使用 302。
- SEO 影响:搜索引擎会跟随 302,但不会把原页面的排名转移到新页面,长期使用可能导致流量分散。
小结:HTTP 302 状态码是用于 临时 重定向的 3xx 系列响应,核心在于通过 Location
头指示客户端访问新的临时地址。它适用于短期页面迁移、登录跳转等场景,但因浏览器实现与规范的细微差异(尤其是对非 GET 请求的处理),在需要明确方法保持时应考虑使用 303、307 或 308。正确使用 302 能提升用户体验,同时避免对搜索引擎抓取和缓存产生不必要的副作用。
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!