# HTTP 状态码与常用请求/响应头速查

快速查表：中文程序员调接口/排查必备。

---

## 一、HTTP 状态码速查（按分类）

### 1xx - 信息类（很少用到）

| 状态码 | 名称 | 含义 | 场景 |
|--------|------|------|------|
| **100** | Continue | 客户端继续发送请求 | POST/PUT 前客户端发 `Expect: 100-continue` 头，服务器同意后才发 body；常见于大文件上传 |
| **101** | Switching Protocols | 切换协议 | 升级到 WebSocket（`Upgrade: websocket`）或 HTTP/2 |

---

### 2xx - 成功（一切正常）

| 状态码 | 名称 | 含义 | 场景 |
|--------|------|------|------|
| **200** | OK | 请求成功，返回结果 | 标准 GET/POST/PUT/PATCH 响应 |
| **201** | Created | 资源创建成功 | POST 创建新资源时返回；应附带 `Location` 头指向新资源 URL |
| **204** | No Content | 请求成功但无返回内容 | DELETE 成功删除、PUT 成功更新但无需返回体，节省带宽 |
| **206** | Partial Content | 部分内容 | 返回分片数据；涉及 `Range` 请求头和 `Content-Range` 响应头；用于断点续传、视频进度条 |

---

### 3xx - 重定向（需要进一步操作）

| 状态码 | 名称 | 含义 | 场景 | 易混对比 |
|--------|------|------|------|---------|
| **301** | Moved Permanently | 永久重定向 | 资源永久移动到新地址；浏览器/客户端会记住，下次直接请求新地址；旧 URL 不再存在 | **301 vs 302**：301 是永久（缓存），302 是临时（不缓存）；**301 vs 308**：301 可能改 POST→GET，308 保持原方法 |
| **302** | Found | 临时重定向 | 资源暂时在其他地址；下次仍会请求原 URL；可能改变 POST→GET（不规范但常见） | 与 307 相似，但 307 保证方法不变 |
| **304** | Not Modified | 资源未修改 | 客户端发 `If-None-Match` / `If-Modified-Since`，服务器告诉"你的缓存版本还有效"；不返回响应体，节省带宽 | 配套 `ETag` / `Last-Modified` 头 |
| **307** | Temporary Redirect | 临时重定向（方法不变） | 与 302 类似但保证 POST 仍为 POST（不改方法） | 307 更规范，但浏览器支持度不如 302；**307 vs 308**：307 临时，308 永久 |
| **308** | Permanent Redirect | 永久重定向（方法不变） | 与 301 类似但保证 POST 仍为 POST（不改方法） | 301 可能改 POST→GET，308 严格保持；最规范但支持度最低 |

**3xx 易混总结**：
- **永久 vs 临时**：301/308（永久，可被缓存）vs 302/307（临时，每次重新请求）
- **方法保证**：308/307 保证方法不变 vs 301/302 可能改 POST→GET

---

### 4xx - 客户端错误（你的请求有问题）

| 状态码 | 名称 | 含义 | 场景 | 易混对比 |
|--------|------|------|------|---------|
| **400** | Bad Request | 请求格式错误 | JSON 解析失败、必填字段缺失、参数类型错误等；排查：检查请求体格式、Content-Type 头 | **400 vs 422**：400 是格式/语法错误，422 是语义错误（格式对但业务规则违反） |
| **401** | Unauthorized | 身份验证失败 | 缺少 Authorization 头、Token 过期、凭证无效；排查：检查 Token/Cookie、验证授权服务器 | **401 vs 403**：401 是"你是谁？"（身份问题），403 是"你不能"（权限问题） |
| **403** | Forbidden | 禁止访问 | 身份有效但权限不足（如普通用户访问管理员接口）；排查：检查用户角色/权限、资源访问策略 | 与 401 区别：已验证身份但被明确拒绝 |
| **404** | Not Found | 资源不存在 | URL 错误、资源被删除；排查：确认 URL 是否正确、检查路由配置 | |
| **405** | Method Not Allowed | 请求方法不支持 | 对 GET 专用接口发 POST；排查：检查接口文档、使用正确的 HTTP 方法 | |
| **409** | Conflict | 冲突 | 并发修改（如数据库版本冲突）、重复创建资源；排查：重试或检查资源当前状态 | 常见于分布式系统、乐观锁冲突 |
| **410** | Gone | 资源永久删除 | 与 404 类似但明确说明资源曾存在过，现已永久删除 | **410 vs 404**：410 暗示资源曾有过，客户端不应继续请求 |
| **422** | Unprocessable Entity | 无法处理的实体 | 请求格式正确但业务规则违反（如邮箱已注册、年龄不符要求）；排查：查看错误详情，修正业务数据 | **422 vs 400**：422 是语义错（业务规则），400 是语法错 |
| **429** | Too Many Requests | 请求过于频繁 | 触发限流；排查：检查 `Retry-After` 头，等待后重试；需要实现指数退避 | 需要遵守服务器的限流策略 |

**4xx 易混总结**：
- **401 vs 403**：前者是身份问题（无 Token/Token 无效），后者是权限问题（有身份但被拒）
- **400 vs 422**：前者是格式/语法错，后者是业务规则错
- **404 vs 410**：前者是"不存在"，后者是"曾存在但现已删除"

---

### 5xx - 服务器错误（服务器出问题了）

| 状态码 | 名称 | 含义 | 场景 | 易混对比 |
|--------|------|------|------|---------|
| **500** | Internal Server Error | 服务器内部错误 | 代码崩溃、未捕获异常、逻辑 bug；排查：查看服务器日志、联系服务方 | 通用的"我也不知道啥错了"响应 |
| **502** | Bad Gateway | 网关错误 | 网关/代理（Nginx/LB）与上游服务器通信失败（无响应、连接重置、超时等）；排查：检查上游服务健康状态、网络连接 | **502 vs 503 vs 504**：502 是网关失败，503 是服务不可用，504 是网关超时 |
| **503** | Service Unavailable | 服务暂时不可用 | 服务器维护、过载、数据库挂掉；排查：稍后重试，查看 `Retry-After` 头；实现自动重试策略 | 通常是临时的（维护）或需要扩容 |
| **504** | Gateway Timeout | 网关超时 | 网关等待上游服务器响应超时（一般是上游慢或未响应）；排查：检查上游服务是否卡住、网络延迟、超时配置 | **504 vs 502**：504 是超时失败，502 是连接失败 |

**5xx 易混总结**：
- **502 vs 503 vs 504**：
  - 502：网关收不到上游响应（连接断、重置、无响应）
  - 503：上游服务明确说自己不可用（维护、过载、降级）
  - 504：网关等待上游太久超时了（上游慢或堵住了）

---

## 二、常用请求头速查

| 请求头 | 值示例 | 含义与作用 |
|--------|--------|----------|
| **Authorization** | `Bearer eyJhbGc...` / `Basic dXNlcjp...` | 身份认证凭证；Bearer 用于 JWT/Token，Basic 用于用户名密码 Base64 编码 |
| **Content-Type** | `application/json` / `multipart/form-data` | 请求体格式；JSON/XML/表单/文件上传等 |
| **Accept** | `application/json, text/html` | 告诉服务器"我接受哪些格式"；服务器应返回匹配的 Content-Type |
| **User-Agent** | `Mozilla/5.0 (Windows NT 10.0; Win64; x64)...` | 客户端身份标识（浏览器、爬虫、SDK）；用于统计、反爬、适配 |
| **Cookie** | `sessionid=abc123; token=xyz789` | 存储在客户端的会话数据；每次请求自动带上 |
| **Referer** | `https://example.com/page` | 请求来源页面 URL；用于反盗链、来源统计；跨域时受限 |
| **Origin** | `https://example.com` | 请求来源域；主要用于 CORS 预检，比 Referer 更严格 |
| **If-None-Match** | `"33a64df551"` | ETag 值；配套 304 Not Modified，用于缓存验证 |
| **If-Modified-Since** | `Wed, 21 Oct 2024 07:28:00 GMT` | 资源修改时间戳；配套 304 Not Modified，用于缓存验证 |
| **Range** | `bytes=200-1023` / `bytes=0-` | 请求文件片段；用于断点续传、视频进度条；需配套 206 响应 |
| **X-Requested-With** | `XMLHttpRequest` | 告诉服务器这是 AJAX 请求；常用于防 CSRF |
| **Cache-Control** | `max-age=3600` | 缓存控制指令；还可带 `no-cache` / `no-store` / `must-revalidate` |
| **X-Forwarded-For** | `203.0.113.45, 70.41.3.18` | 真实客户端 IP；由代理/网关添加，便于日志审计 |
| **Connection** | `keep-alive` / `close` | 连接管理；HTTP/1.1 默认 keep-alive，keep-alive 复用 TCP 连接 |

---

## 三、常用响应头速查

| 响应头 | 值示例 | 含义与作用 |
|--------|--------|----------|
| **Content-Type** | `application/json; charset=utf-8` | 响应体格式；告诉客户端如何解析（JSON/HTML/PDF 等） |
| **Content-Length** | `1234` | 响应体字节数；便于客户端知道何时读完 |
| **Cache-Control** | `public, max-age=3600` / `no-cache` | 缓存策略；`max-age` 缓存秒数，`no-cache` 每次验证，`no-store` 禁用缓存 |
| **ETag** | `"33a64df551427"` | 资源版本标记；客户端下次用 `If-None-Match` 验证，服务器返回 304 |
| **Last-Modified** | `Wed, 21 Oct 2024 07:28:00 GMT` | 资源最后修改时间；客户端下次用 `If-Modified-Since` 验证 |
| **Set-Cookie** | `sessionid=abc123; Path=/; HttpOnly; Secure` | 设置浏览器 Cookie；后续自动在请求头中发送；HttpOnly 防 XSS，Secure 仅 HTTPS |
| **Location** | `https://example.com/new-path` | 重定向目标 URL；配套 301/302/307/308/3xx 状态码 |
| **Access-Control-Allow-Origin** | `https://frontend.com` / `*` | CORS 跨域：允许哪些源访问；`*` 允许所有源 |
| **Access-Control-Allow-Methods** | `GET, POST, PUT, DELETE` | CORS：允许哪些 HTTP 方法 |
| **Access-Control-Allow-Headers** | `Content-Type, Authorization` | CORS：允许哪些请求头 |
| **Access-Control-Allow-Credentials** | `true` | CORS：是否允许发送凭证（Cookie/认证）；必须配套 `Allow-Origin` 不为 `*` |
| **Content-Encoding** | `gzip` / `deflate` / `br` | 响应体压缩方式；减小传输大小；客户端自动解压 |
| **Content-Range** | `bytes 200-1023/2048` | 分片响应范围；配套 206 状态码，用于断点续传 |
| **Retry-After** | `120` / `Wed, 21 Oct 2024 07:28:00 GMT` | 重试等待时间（秒数或时间戳）；配套 429/503 状态码 |
| **X-RateLimit-Limit** | `100` | 限流配额：该时间窗口内允许请求数 |
| **X-RateLimit-Remaining** | `42` | 限流配额：剩余可用请求数 |
| **X-RateLimit-Reset** | `1635060480` | 限流配额：重置时间戳（Unix 时间） |
| **Server** | `nginx/1.21.0` | 服务器软件标识；用于漏洞扫描、版本识别 |
| **Strict-Transport-Security** | `max-age=31536000; includeSubDomains` | HSTS：强制 HTTPS；浏览器会记住，后续自动升级为 HTTPS |

---

## 四、排查场景 → 优先查看

| 排查场景 | 优先检查的状态码/头 | 检查步骤 |
|----------|-------------------|---------|
| **前端访问被拒** | 401 / 403 | 1. 看是 401（检查 Token/Cookie）还是 403（检查权限）2. 查 Authorization 请求头 3. 看是否过期/无效 |
| **跨域报错** | 无法看到响应体（CORS 预检失败） | 1. 看 Network 有无 OPTIONS 预检请求 2. 检查 Access-Control-Allow-Origin / Allow-Methods / Allow-Headers 3. 若发送凭证需 Credentials=true 且 Origin 不能为 * |
| **请求被拒** | 400 / 422 / 405 | 1. 400：检查 JSON 格式、必填字段、Content-Type 2. 422：检查业务规则（重复、数据不符）3. 405：检查 HTTP 方法（GET/POST/PUT 等）是否匹配 |
| **请求超时/无响应** | 504 / 502 / 请求挂起 | 1. 504：网关超时，上游服务慢；增加超时时间 2. 502：网关失败，上游服务下线；联系后端 3. 无响应：检查网络、防火墙、DNS |
| **服务故障/维护** | 503 / 500 | 1. 503：查 Retry-After 头，稍后重试 2. 500：查服务器日志，告知后端 |
| **资源未更新（缓存问题）** | 304 | 1. 看请求有无 If-None-Match / If-Modified-Since 头 2. 响应有无 ETag / Last-Modified 头 3. 刷新时加 Cache-Control: no-cache 强制验证 |
| **限流被封** | 429 | 1. 查 X-RateLimit-* 头了解配额 2. 查 Retry-After 头等待多久 3. 实现指数退避重试策略 |
| **文件下载中断** | 206 / Content-Range | 1. 检查请求有无 Range 头 2. 响应有无 Content-Range 和分片大小 3. 实现断点续传逻辑 |
| **重定向死循环/过多** | 301 / 302 / 307 / 308 | 1. 追踪 Location 头是否形成闭环 2. 检查重定向深度（不超过 5 级） 3. 看浏览器控制台的重定向链 |

---

## 五、速记技巧

### 记忆 3xx（重定向）
- **301/302 按时间**：301 永久 / 302 临时
- **307/308 按方法**：307/308 保证方法（如 POST 仍为 POST）；301/302 可能改 POST→GET
- **304 Not Modified**：缓存有效，省流量

### 记忆 4xx（客户端错）
- **401 vs 403**：401 是"我是谁？"（验证失败），403 是"我不给"（权限不足）
- **400 vs 422**：400 格式错（JSON 坏了），422 业务错（规则违反）
- **404 vs 410**：404 "找不到"，410 "曾有过但删了"

### 记忆 5xx（服务器错）
- **502 vs 503 vs 504**：502 网关失败 / 503 服务不可用 / 504 网关超时
  - 502：网关与上游"连不了"
  - 503：上游明确说"我不行"（维护/过载）
  - 504：网关"等得太久"（上游太慢）

### CORS（跨域）快速检查
```
预检请求失败 → 看浏览器 Console 和 Network 的 OPTIONS 请求
→ 检查响应头 Access-Control-Allow-Origin 是否匹配
→ 检查 Allow-Methods/Allow-Headers 是否包含你用的方法/头
→ 若发送 Cookie 需 Credentials=true 且 Origin 不能为 *
```

### 缓存验证快速检查
```
304 Not Modified 出现 → 检查请求头有无 If-None-Match/If-Modified-Since
→ 检查响应头有无 ETag/Last-Modified
→ 强制刷新：加 Cache-Control: no-cache（验证）或 no-store（禁缓存）
```

---

## 六、常见错误处理示例

### 网络错误排查流程
```
请求失败
├─ 无响应 / 超时 → 504/连接问题
│  └─ 检查：上游服务、网络延迟、DNS 解析
├─ 返回 502 → 网关无法连接上游
│  └─ 检查：上游服务是否启动、网络是否通
├─ 返回 503 → 服务不可用（维护/过载）
│  └─ 等待 Retry-After 后重试
└─ 返回 500 → 服务器代码崩溃
   └─ 查后端日志，修复 bug
```

### 认证/授权排查流程
```
请求被拒
├─ 返回 401 → 身份验证失败
│  ├─ 无 Authorization 头 → 补充 Token
│  ├─ Token 过期 → 刷新 Token
│  └─ Token 无效 → 重新登录
├─ 返回 403 → 权限不足
│  ├─ 检查用户角色
│  ├─ 检查资源权限策略
│  └─ 申请提权或联系管理员
└─ 返回 400/422 → 请求参数错
   ├─ 检查 JSON 格式、必填字段
   └─ 查错误详情信息
```

### 限流/重试策略
```
遇到 429 → 触发限流
├─ 读 Retry-After 头（等待秒数或时间戳）
├─ 读 X-RateLimit-Reset（配额重置时间）
└─ 实现指数退避重试（延迟 1s → 2s → 4s → 8s）
```

---

**最后更新**：2026-07-12  
**用途**：快速参考、调试排查、面试准备
