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

上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。

1xx 信息2xx 成功3xx 重定向4xx 客户端错误5xx 服务器错误
状态码英文名称中文名称分类说明
100Continue继续1xx 信息客户端应继续发送请求体。
101Switching Protocols切换协议1xx 信息服务器同意切换协议(如升级到 WebSocket)。
102Processing处理中1xx 信息服务器已收到请求,仍在处理中。
200OK成功2xx 成功请求成功。最常见的状态码。
201Created已创建2xx 成功请求成功并创建了新资源(POST 请求常见)。
202Accepted已接受2xx 成功请求已接受但尚未处理完成(异步任务)。
204No Content无内容2xx 成功请求成功但无内容返回(DELETE 请求常见)。
206Partial Content部分内容2xx 成功服务器返回部分内容(Range 请求)。
301Moved Permanently永久重定向3xx 重定向资源已永久移动到新 URL。SEO 权重传递。
302Found临时重定向3xx 重定向资源临时移动到新 URL。不传递 SEO 权重。
304Not Modified未修改3xx 重定向资源未修改,客户端应使用缓存版本。
307Temporary Redirect临时重定向(保持方法)3xx 重定向临时重定向,保持原始请求方法。
308Permanent Redirect永久重定向(保持方法)3xx 重定向永久重定向,保持原始请求方法。
400Bad Request请求错误4xx 客户端错误请求语法错误或参数无效。
401Unauthorized未授权4xx 客户端错误需要身份验证。常见于缺少或无效的 Token。
403Forbidden禁止访问4xx 客户端错误服务器拒绝请求(权限不足)。
404Not Found未找到4xx 客户端错误请求的资源不存在。最常见的客户端错误。
405Method Not Allowed方法不允许4xx 客户端错误请求方法不被允许(如对只支持 GET 的接口发 POST)。
408Request Timeout请求超时4xx 客户端错误客户端未在服务器超时时间内发送请求。
409Conflict冲突4xx 客户端错误请求与服务器当前状态冲突(如重复创建)。
410Gone已删除4xx 客户端错误资源已永久删除(比 404 更明确)。
413Payload Too Large请求体过大4xx 客户端错误请求体超过服务器限制(如上传文件过大)。
415Unsupported Media Type不支持的媒体类型4xx 客户端错误请求的 Content-Type 不被服务器支持。
422Unprocessable Entity无法处理的实体4xx 客户端错误请求格式正确但语义错误(如字段验证失败)。
429Too Many Requests请求过多4xx 客户端错误请求频率超过限制(限流)。
500Internal Server Error服务器内部错误5xx 服务器错误服务器遇到意外错误。最常见的服务器错误。
501Not Implemented未实现5xx 服务器错误服务器不支持请求的功能。
502Bad Gateway网关错误5xx 服务器错误网关/代理从上游服务器收到无效响应。
503Service Unavailable服务不可用5xx 服务器错误服务暂时不可用(过载或维护中)。
504Gateway Timeout网关超时5xx 服务器错误网关/代理等待上游服务器超时。
511Network 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 头重试。