HTTP 状态码速查表 - HTTP 响应状态码大全

状态码的价值不在背表,而在把排查方向从"整个系统猜一遍"收窄到某一层。分层的判断依据是:码的来源决定它指谁。3xx 与 4xx 基本指向客户端——3xx 看重定向是否被跟随,4xx 看请求本身或身份与权限;5xx 则多由服务端或中间层产生,其中 Nginx 与网关自己生成的码(413、429、502、504)和应用主动抛的码含义完全不同,混为一谈会把方向查反。本表按 1xx 到 5xx 分栏,每栏给出含义、典型成因与处理建议,并单列边缘层场景,重点辨析几组最常被搞错的组合:401 是不知道你是谁、403 是知道你是谁但不允许;302 与 307 的差别在于是否允许把 POST 改成 GET;502 是后端给了无效响应、504 是后端接上了但没在时限内答完。看码之后的下一步动作应该是明确的:查哪台机器的哪个日志、核对哪个配置项。

参考手册·共 38 条命令·最后更新 2026-07-21
http状态码nginxrest

典型使用场景

联调接口报 500 时先看 5xx 栏,区分是代码异常还是网关转发失败;后端返回 401 提示先补 Token 或登录,403 则是认证通过但权限不足,需对照 4xx 语义检查接口授权;Nginx 报 413/429 时按对应排障说明调大 body 上限或限流配置;阅读后即便只看到状态码,也能确定下一步是查日志、改请求,还是调整服务端或网关配置。

1xx 信息 Informational 2

100 Continue
客户端应继续发送请求体,常用于大上传前的预检
101 Switching Protocols
协议切换,WebSocket 升级握手时返回

2xx 成功 Success 5

200 OK
请求成功,GET 返回资源,PUT/PATCH 返回更新结果
201 Created
资源创建成功,POST 请求后返回,Location 头指向新资源
202 Accepted
请求已接收但未处理完,异步任务/队列处理时返回
204 No Content
成功但无响应体,DELETE 请求常用
206 Partial Content
范围请求成功,断点续传 / 视频拖拽时返回

3xx 重定向 Redirection 6

301 Moved Permanently
永久重定向,SEO 权重转移,HTTP→HTTPS 跳转用
302 Found
临时重定向,不转移权重
303 See Other
重定向用 GET 获取,PRG 模式(表单提交后跳转)
304 Not Modified
资源未修改,用缓存,条件请求(If-None-Match)命中
307 Temporary Redirect
临时重定向,保持请求方法不变(302 可能改 POST 为 GET)
308 Permanent Redirect
永久重定向,保持请求方法不变

4xx 客户端错误 Client Error 17

400 Bad Request
请求语法错误,如 JSON 格式不合法、缺少必填参数
401 Unauthorized
未认证,缺少或无效的 Token/Cookie,需登录
403 Forbidden
已认证但无权限,如普通用户访问管理接口
404 Not Found
资源不存在,URL 路径错误或资源已删除
405 Method Not Allowed
请求方法不允许,如对只支持 GET 的接口发 POST
406 Not Acceptable
请求的 Accept 头无法满足,内容协商无可用格式
408 Request Timeout
请求超时,客户端未在规定时间内发送完请求
409 Conflict
资源冲突,如重复创建、并发修改
410 Gone
资源已永久删除,SEO 中告知爬虫不再索引(比 404 更明确)
413 Payload Too Large
请求体过大,Nginx client_max_body_size 限制
415 Unsupported Media Type
不支持的 Content-Type,如接口要 JSON 却发 form
418 I'm a teapot
愚人节彩蛋(RFC 2324),茶壶不能煮咖啡
422 Unprocessable Entity
语义错误,如字段格式对但值非法,Rails API 校验失败常用
426 Upgrade Required
要求客户端升级协议,如强制 TLS 或 HTTP/2
429 Too Many Requests
请求频率超限,限流触发(如 Nginx limit_req)
431 Request Header Fields Too Large
请求头过大,如 Cookie 过多,需清理或调大头限制
451 Unavailable For Legal Reasons
因法律原因不可用,如内容审查、DMCA 下架

5xx 服务端错误 Server Error 8

500 Internal Server Error
服务端内部错误,代码异常、空指针等
501 Not Implemented
服务器不支持该请求方法
502 Bad Gateway
网关收到上游无效响应,Nginx 连不上后端或后端崩溃
503 Service Unavailable
服务不可用,过载、维护中或限流,Retry-After 头提示重试时间
504 Gateway Timeout
网关等待上游超时,Nginx proxy_read_timeout 超限
505 HTTP Version Not Supported
不支持 HTTP 协议版本
507 Insufficient Storage
存储空间不足,WebDAV 写入失败时返回
511 Network Authentication Required
需网络认证,公共 WiFi 登录页场景

参数矩阵

参数作用示例
100 Continue客户端应继续发送请求体,大上传前的预检信号
101 Switching Protocols协议切换确认,WebSocket 升级握手成功后即返回它
200 OK请求成功,GET 返回资源、PUT / PATCH 返回更新结果
201 Created资源创建成功,POST 之后返回并在 Location 头指向新资源
202 Accepted已接收但尚未处理完,异步任务与队列场景用它
204 No Content成功但没有响应体,DELETE 请求常用
206 Partial Content范围请求成功,断点续传与视频拖拽依赖它
301 Moved Permanently永久重定向并转移 SEO 权重,HTTP 跳 HTTPS 用它
302 Found临时重定向不转移权重,且可能把 POST 改写成 GET
303 See Other明确要求改用 GET 取结果,表单提交后跳转的 PRG 模式
304 Not Modified资源未修改可直接用缓存,条件请求命中时返回
307 / 308重定向但保持原请求方法,需要保住 POST 时用它们而非 302
400 Bad Request请求语法不合法,JSON 格式错误或缺必填参数都落在这里
401 Unauthorized未认证,缺少或无效的 Token / Cookie,需要先登录
403 Forbidden已认证但无权限,身份没问题而授权不通过
404 Not Found资源不存在,路径写错或资源已被删除
405 Method Not Allowed请求方法不允许,对只支持 GET 的接口发 POST 即触发
406 Not AcceptableAccept 头无法满足,内容协商找不到可用格式
408 / 429408 是客户端发得太慢,429 是请求频率超限触发限流
409 Conflict资源状态冲突,重复创建与并发修改都归它
410 Gone资源被永久删除,比 404 更明确地告知爬虫不要索引
413 Payload Too Large请求体超出上限,Nginx 侧由 client_max_body_size 控制
415 Unsupported Media TypeContent-Type 不支持,接口要 JSON 却发了表单即触发
422 Unprocessable Entity格式对但值非法,字段校验失败的语义级错误用它
426 / 431426 要求升级协议,431 是请求头过大(Cookie 塞满)
500 Internal Server Error服务端代码异常或空指针,排查从应用日志入手
501 Not Implemented服务器不支持该请求方法,与 405 相反:这里的责任在服务端
502 Bad Gateway网关拿到上游无效响应,上游崩溃或拒绝连接
503 Service Unavailable服务主动不可用:过载、维护或限流,Retry-After 给出重试时间
504 Gateway Timeout网关等待上游超时,对应 proxy_read_timeout 超限
505 / 507 / 511分别是协议版本不支持、存储空间不足、需网络认证

易错点与避坑指南

现象浏览器控制台只显示网络错误,实际后端返回的是 4xx。

原因跨域场景下浏览器拿不到响应体与状态,失败被折叠成一条泛化的网络错误信息。

处置先用 curl 直连后端确认真实状态码,再回头检查 CORS 响应头,不要按浏览器看到的现象定位。

现象排查 5xx 时改了应用代码却毫无变化。

原因502 与 504 多由网关到上游的连接或等待超时引起,响应根本没到应用层,改应用自然没有效果。

处置先确认应用是否真的在监听,再看网关的健康检查与超时配置,定位顺序不要倒过来。

现象客户端把 301 当临时跳转处理,缓存里留着旧地址。

原因301 会被浏览器与各类客户端缓存,权重也一并转移;服务端改成 301 后旧跳转仍会一直生效。

处置改回源地址前先清掉缓存,或改用 302 作为临时跳转,确认生效后再决定是否固化。

现象网关日志里的状态码和后端实际返回的对不上。

原因反向代理的错误页会用自己的状态码替换上游的真实状态,最终响应里看到的是代理层的结果。

处置调试时绕过代理错误页,或用 curl 直连后端确认它自己返回的状态码。

现象文件上传偶发 413,改小文件又正常。

原因请求体超过代理层的上限,小文件未触发该阈值;限制来自网关配置而不是应用自身。

处置调大 Nginx 侧的 client_max_body_size,并确认应用自身的大小限制同步放宽。

现象限流误伤正常用户,429 出现在完全正常的流量上。

原因限流键的取值维度选错(如按 IP 统计时大量用户共用同一出口 IP),健康流量被算进同一个桶。

处置核对限流键的维度并改成按用户或按接口路径区分,排查前先看 Retry-After 确认真是限流而非其它 4xx。

现象重试逻辑写死固定等待,服务端明确要求等更久。

原因429 与 503 的真实退避时长写在 Retry-After 响应头里,固定 sleep 忽略了服务端给出的节奏。

处置重试逻辑改为读取 Retry-After 后再等待,不要用固定值覆盖它。

现象接口返回 200,但业务上分明是失败。

原因用 200 包业务错误码,HTTP 层无法区分成败,监控与前端只能靠解析响应体才知道结果。

处置把失败映射到对应状态码(认证用 401、权限用 403、参数用 400 或 422),状态码与业务码各管一层。

现象表单提交后浏览器又发了一次 GET,服务端收到的字段全变。

原因302 在重定向时可能把 POST 改写成 GET,表单数据因此丢失;而 303 明确要求改用 GET。

处置需要保持请求方法就用 307;表单提交后跳转这一 PRG 模式按约定改用 303。

排障路径

  1. 1先用 curl 确认真实状态码,别信浏览器看到的现象

    curl -sI https://example.com

    第一行即真实状态码;跨域失败时浏览器只能报网络错误,这条命令能把被隐藏的 4xx 挖出来。

  2. 2状态码与总耗时一起取出,做可观测的探测

    curl -s -o /dev/null -w '%{http_code} %{time_total}\n' https://example.com

    终端只剩一行;时间单位为秒,可以直接作为延迟告警的判据。

  3. 3跟完重定向链,确认最终落点与每一跳的状态

    curl -sIL https://example.com

    输出会依次列出每一跳的状态码;301 与 302 在这里能看出差别,也能确认是否落到了中转页。

  4. 4统计服务端日志里的 5xx 分布,判断是哪一类

    grep -c '\" 50[0-9] ' /var/log/nginx/access.log

    计数上升说明 5xx 在发生;再按 502 与 504 分别统计即可区分「上游无效响应」与「等待上游超时」。

  5. 5确认限流是否真的触发,以及该等多久再重试

    curl -sI https://example.com | grep -i 'retry-after'

    有输出说明服务端给了退避时长,重试逻辑应读它而不是固定等待;无输出则 429 来自别的环节。

命令示例

只看接口返回的状态码

curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/users/1

用 curl 丢弃响应体只输出状态码:200 成功、404 路径不符、401 缺凭证、500 服务端异常,适合一行判断接口是否可用。

输出

200

统计 Nginx 访问日志里的 5xx 分布

awk '$9 ~ /^5[0-9][0-9]$/ {print $9}' /var/log/nginx/access.log | sort | uniq -c

区别权重:502 是拿到上游无效响应(后端崩溃/拒绝连接),504 是连接成功但等待超时,据此决定查后端进程还是调高 proxy timeouts。

输出

      3 502
      5 504

确认 429 触发限流后的重试时机

curl -i https://api.example.com/search?q=laohand

429 表示触发限流,优先读取 Retry-After 响应头(单位秒)再重试,避免继续打爆接口或被封禁。

输出

HTTP/1.1 429 Too Many Requests
Retry-After: 120

常见坑与注意事项

  • 不要用 200 包错误码:若接口用 200 + 响应体内业务码表达失败,前端无法靠状态码判断成败,属于反模式。
  • 301 会被浏览器/Clients 缓存:改回源 URL 前先清缓存或用 302 临时跳,避免看到旧跳转。
  • 400 与 422 都表示请求有误:400 是语法/结构不合法,422 是字段值非法(语义错误),校验失败接参时更贴切。
  • 502 与 503 别混用:502 是网关拿到无效上游响应,503 是服务主动不可用(过载/维护),混淆会误导告警归类。
  • 排查时确认响应是否被代理层改写:Nginx 默认错误页可能掩盖真实上游状态码,调试先看真正后端返回。

提示

  • 502 vs 504:502 是后端返回了无效响应(崩溃/拒绝连接),504 是后端连接成功但响应超时。
  • 401 vs 403:401 是"你是谁"(未认证),403 是"你不能做"(已认证但无权限)。
  • Nginx 413 解决:调大 client_max_body_size;429 解决:检查 limit_req 限流配置。
  • 跨域下 4xx 可能被浏览器隐藏成网络错误:先用 curl 直连后端确认真实状态码,再排查 CORS 响应头,别被前端看到的现象误导。
  • 429 的 Retry-After 头是服务端给出的真实退避时长,重试逻辑应读它而不是固定 sleep;网关层的 429 则要看限流键是否设错导致误伤正常用户。
  • 5xx 排查优先看应用日志而非负载均衡:502/504 多由上游连接或超时引起,定位顺序是先确认应用是否在监听,再看 LB 的健康检查与超时配置。

常见问题

常见的 HTTP 状态码有哪些?

按首位数字分 5 类:1xx 信息(如 100 Continue)、2xx 成功(200 OK、201 Created)、3xx 重定向(301 永久、302 临时、304 未改)、4xx 客户端错误(400/401/403/404/429)、5xx 服务端错误(500/502/503/504)。本页按 1xx~5xx 全系列列出含义、成因与排障建议。

401 和 403 有什么区别?

401 表示「未认证」——请求没带身份凭证或凭证无效,需要登录;403 表示「已认证但无权限」——身份没问题,但不允许访问该资源。先看有没有登录,再判断权限。

301 和 302 重定向有什么不同?

301 是永久重定向,浏览器和搜索引擎会把权重与书签迁到新地址;302 是临时重定向,原地址仍保留。做迁移用 301,做 A/B 或临时跳转用 302。

接口返回 4xx 和 5xx 怎么区分是谁的问题?

4xx 是客户端问题(参数错、未登录、无权限、路径不存在),先查请求;5xx 是服务端问题(代码异常、后端超时、网关 502/504),先查服务端日志与依赖。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们