HTTP 状态码完整参考表
HTTP 状态码(HTTP Status Code)是服务器对客户端请求的响应状态标识,由 3 位数字组成,分为 5 大类。本表覆盖所有常用状态码,包含中英文名称和详细说明。
原理解析
HTTP 状态码是服务器对请求的 3 位数字回应,首位数字直接决定类别:1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务器错误。具体含义由 RFC 7231 等规范定义。
状态码与方法是配套的:4xx 暗示请求方该改(参数/权限/URL),5xx 暗示服务端出问题。正确使用 301/302/308 等重定向对 SEO 权重传递至关重要,429 用于限流,503 表示临时不可用并常带 Retry-After。
什么时候该查这张表
这张表在你要确认某个 HTTP 状态码的准确含义与分类时有用。它给出 42 个常用状态码的英文名、中文名、所属分类(1xx–5xx)与说明。写接口文档、读框架源码或排查接口异常时查它。
不该查的情况:你在做完整的 API 错误码体系设计或 HTTP/2 与 HTTP/3 的协议差异分析。本表只覆盖 HTTP/1.1 时代的标准状态码,不含非标准的私有码(各家云与框架的自定义码)与语义化替代方案。
判断标准:先看首位数字。1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错、5xx 服务端错。这个五分法能解决 80% 的判断 —— 看到 404 就知道是资源不存在(客户端侧),看到 502 就知道是网关拿不到上游响应(服务端侧)。
特别注意:同一族内的码含义并不总是「程度递进」。301 与 302 都表示重定向但前者是永久的(会被浏览器与中间层缓存),307 与 308 保持方法不变而 302/303 会把 POST 改成 GET。选错会导致接口行为与预期不符。
边界与常见陷阱
502 与 504 的区别在于「谁的问题」,不是错误严重程度
502 Bad Gateway = 网关收到了上游的无效响应(连接被拒、超时后拿到空响应、上游进程崩了)。504 Gateway Timeout = 网关在等待时间内没等到上游响应(上游慢或卡住)。排查方向完全不同:502 要查上游服务是否在跑、端口是否监听、负载均衡后端是否健康;504 要查上游性能、慢查询、连接池耗尽。把 504 当 502 查会一直找不到原因。
302 会把 POST 改成 GET,307/308 才保持方法
这是最容易出隐性 bug 的地方:表单 POST 到某个 URL,服务端返回 302,浏览器自动改用 GET 重新请求 —— body 丢失了。如果客户端是 XHR 且手动跟随重定向,行为可能又不同。修正确保方法不变的方案是 307(临时)或 308(永久)。反过来,如果你确实想把 POST 转成 GET,就该用 302/303。别混用:303 明确要求改 GET,而 302 的方法依赖客户端实现。
429 与 503 的选择决定了客户端怎么退避
429 Too Many Requests = 限流(请求太快,配 Retry-After 告知何时重试);503 Service Unavailable = 服务暂时不可用(过载或维护中)。两者的语义差别会影响客户端策略:把 503 当 429 处理会让客户端以为是自己的频率问题而立即重试,反而加剧过载。正确做法是:限流返回 429 并带 Retry-After 秒数;维护窗口返回 503 并带 Retry-After 或用 503 配合 Retry-After 头,让客户端尊重这个时间窗。
与相邻内容的分工
要查具体请求头字段的语义(Cache-Control、Accept 等),用站内「HTTP 请求头」页;本页只讲状态码。
要选对方法(PUT 与 PATCH 的区别、幂等性),用站内「HTTP 方法」页,与本页配套。
要理解 HTTP/2 的多路复用与 HPACK 头压缩,属协议实现层面,本表不覆盖。
若目的是排查某个具体接口异常,先看响应体内容与响应头,状态码只说明大类、不说明原因。
实战片段
要点:① 按首位数字五分(1xx 信息 / 2xx 成功 / 3xx 重定向 / 4xx 客户端错 / 5xx 服务端错)能解决 80% 的判断;② 502 与 504 的区别是「谁的问题」而非严重程度 —— 502 是网关拿到无效响应(查上游是否在跑、端口是否监听),504 是等待超时(查上游性能、慢查询、连接池);③ 302 会把 POST 改成 GET 导致 body 丢失,需要保方法用 307/308;④ 限流返回 429 + Retry-After,维护窗口返回 503 + Retry-After,混淆会让客户端立即重试加剧过载。
// ① 按首位数字分类
function statusClass(code) {
if (code < 200) return 'info'
if (code < 300) return 'success'
if (code < 400) return 'redirect'
if (code < 500) return 'client-error'
if (code < 600) return 'server-error'
return 'unknown'
}
// ② 502 与 504:排查方向完全不同
function diagnoseGatewayError(code, ctx) {
if (code === 502) {
// 收到了无效响应 ⇒ 上游有问题
return [
'上游进程是否在跑:systemctl status / docker ps',
'端口是否监听:ss -tlnp | grep ' + ctx.port,
'负载均衡后端健康检查是否通过',
]
}
if (code === 504) {
// 等待超时 ⇒ 上游慢或卡住
return [
'上游响应时间:curl -w "%{time_total}" ' + ctx.url,
'是否有慢查询或锁等待',
'连接池是否耗尽(DB / HTTP client)',
]
}
return ['先看响应体与响应头,状态码只说明大类']
}
// ③ 302 会把 POST 改成 GET ⇒ 需要保方法用 307/308
// ❌ res.redirect(302, '/target') 浏览器可能把 POST 变 GET,body 丢失
// ✅ res.redirect(307, '/target') 临时重定向,保持方法与 body
// ✅ res.redirect(308, '/target') 永久重定向,保持方法
// 反过来:确实想把 POST 转 GET ⇒ 用 302 或 303(303 明确要求 GET)
// ④ 限流用 429,维护/过载用 503,都带 Retry-After
function rateLimited(retryAfterSec) {
return { status: 429, headers: { 'Retry-After': String(retryAfterSec) } }
}
function unavailable(retryAfterSec) {
return { status: 503, headers: { 'Retry-After': String(retryAfterSec) } }
}
console.log(statusClass(404), statusClass(502), statusClass(429))实践注解
- 304 与 204 都会让 fetch 拿到「空 body」304(未修改)没有响应体,204(无内容)同理。前端若直接 response.json() 解析会抛错——304 应改用缓存副本,204 应把「无内容」当作正常成功态处理,而不是解析 body。
- 401 与 403 的处置完全不同401 表示「没带或带了无效凭证」,客户端应重新登录/刷新令牌;403 表示「身份已确认但无权访问」,重试登录没有意义。把 403 当 401 处理会造成「刷新令牌 → 再 403」的死循环。
- 502/503/504 是网关层的错,不是源站业务错这三个码由反向代理或 CDN 返回,说明请求可能根本没有到达业务进程(502 上游返回无效响应、503 无可用实例、504 上游超时)。排查要去看网关日志与实例健康检查,而不是查业务代码。
数据来源
- RFC 9110 §15
- RFC 9111 (cache-related status codes)
- IANA HTTP Status Code Registry
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
| 状态码 | 英文名称 | 中文名称 | 分类 | 说明 |
|---|---|---|---|---|
| 100 | Continue | 继续 | 1xx 信息 | 客户端应继续发送请求体。 |
| 101 | Switching Protocols | 切换协议 | 1xx 信息 | 服务器同意切换协议(如升级到 WebSocket)。 |
| 102 | Processing | 处理中 | 1xx 信息 | 服务器已收到请求,仍在处理中。 |
| 200 | OK | 成功 | 2xx 成功 | 请求成功。最常见的状态码。 |
| 201 | Created | 已创建 | 2xx 成功 | 请求成功并创建了新资源(POST 请求常见)。 |
| 202 | Accepted | 已接受 | 2xx 成功 | 请求已接受但尚未处理完成(异步任务)。 |
| 204 | No Content | 无内容 | 2xx 成功 | 请求成功但无内容返回(DELETE 请求常见)。 |
| 206 | Partial Content | 部分内容 | 2xx 成功 | 服务器返回部分内容(Range 请求)。 |
| 301 | Moved Permanently | 永久重定向 | 3xx 重定向 | 资源已永久移动到新 URL。SEO 权重传递。 |
| 302 | Found | 临时重定向 | 3xx 重定向 | 资源临时移动到新 URL。不传递 SEO 权重。 |
| 304 | Not Modified | 未修改 | 3xx 重定向 | 资源未修改,客户端应使用缓存版本。 |
| 307 | Temporary Redirect | 临时重定向(保持方法) | 3xx 重定向 | 临时重定向,保持原始请求方法。 |
| 308 | Permanent Redirect | 永久重定向(保持方法) | 3xx 重定向 | 永久重定向,保持原始请求方法。 |
| 400 | Bad Request | 请求错误 | 4xx 客户端错误 | 请求语法错误或参数无效。 |
| 401 | Unauthorized | 未授权 | 4xx 客户端错误 | 需要身份验证。常见于缺少或无效的 Token。 |
| 403 | Forbidden | 禁止访问 | 4xx 客户端错误 | 服务器拒绝请求(权限不足)。 |
| 404 | Not Found | 未找到 | 4xx 客户端错误 | 请求的资源不存在。最常见的客户端错误。 |
| 405 | Method Not Allowed | 方法不允许 | 4xx 客户端错误 | 请求方法不被允许(如对只支持 GET 的接口发 POST)。 |
| 408 | Request Timeout | 请求超时 | 4xx 客户端错误 | 客户端未在服务器超时时间内发送请求。 |
| 409 | Conflict | 冲突 | 4xx 客户端错误 | 请求与服务器当前状态冲突(如重复创建)。 |
| 410 | Gone | 已删除 | 4xx 客户端错误 | 资源已永久删除(比 404 更明确)。 |
| 413 | Payload Too Large | 请求体过大 | 4xx 客户端错误 | 请求体超过服务器限制(如上传文件过大)。 |
| 415 | Unsupported Media Type | 不支持的媒体类型 | 4xx 客户端错误 | 请求的 Content-Type 不被服务器支持。 |
| 422 | Unprocessable Entity | 无法处理的实体 | 4xx 客户端错误 | 请求格式正确但语义错误(如字段验证失败)。 |
| 429 | Too Many Requests | 请求过多 | 4xx 客户端错误 | 请求频率超过限制(限流)。 |
| 500 | Internal Server Error | 服务器内部错误 | 5xx 服务器错误 | 服务器遇到意外错误。最常见的服务器错误。 |
| 501 | Not Implemented | 未实现 | 5xx 服务器错误 | 服务器不支持请求的功能。 |
| 502 | Bad Gateway | 网关错误 | 5xx 服务器错误 | 网关/代理从上游服务器收到无效响应。 |
| 503 | Service Unavailable | 服务不可用 | 5xx 服务器错误 | 服务暂时不可用(过载或维护中)。 |
| 504 | Gateway Timeout | 网关超时 | 5xx 服务器错误 | 网关/代理等待上游服务器超时。 |
| 511 | Network Authentication Required | 需要网络认证 | 5xx 服务器错误 | 需要网络认证(如公共 WiFi 登录页)。 |
常见问题
301 和 302 重定向有什么区别?
301 是永久重定向,会传递 SEO 权重(链接权益)给新 URL;302 是临时重定向,通常不传递权重。308 / 307 是保持原请求方法(如 POST)的对应版本。
404 和 410 有什么区别?
404 表示资源未找到(可能暂时不可用);410 表示资源已永久删除,比 404 更明确,利于搜索引擎快速清理失效页。
500 和 503 有什么区别?
500 是未预期的服务端错误;503 是服务暂时不可用(过载或维护),通常带 Retry-After 头,搜索引擎会稍后重试。
429 状态码是什么意思?
请求过多(Too Many Requests),表示触发了限流。客户端应降低请求频率并根据 Retry-After 头重试。