前几天,半夜被拉进一个群。值班的朋友发来一张截图:“接口一直报 502,我是不是该重启服务器了?”
我问他:"网关日志看了吗?"他说:“看不懂,502 不就是服务器挂了吗?”
说实话,这段对话让我想起几年前的自己。那时候我只认识三个状态码:200、404、500。遇到别的,就复制下来去搜,搜完还是一头雾水:301 和 302 到底啥区别?401 和 403 不是一回事吗?502 和 504 是不是写错了?
后来实在受不了这种到处搜的日子,干脆把 HTTP 状态码系统整理成了一份速查表。这篇文章把整理结果分享给你,看完之后,遇到任何报错码都能一眼定位方向。
为什么要专门记状态码?
HTTP 官方注册的状态码有 60 多个,其中 90% 你这辈子可能都见不到。但剩下那十几个,会在日常开发里反复出现。不认识它们的代价很真实:
🔴 排查方向跑偏 502 是网关问题,你去重启应用服务器,折腾一小时发现问题还在。
🔴 相似码混淆 401 和 403 看着像,处理方式完全不同,搞混了就是白干。
🔴 前后端扯皮 4xx 是客户端的问题,5xx 是服务端的问题。知道码属于哪一类,一秒定位该找谁。
好消息是:状态码的规律性非常强,记住第一位数字就够了。
一分钟记住五大类
第一位数字决定分类,这是全文最重要的一条规则:
| 1xx | 信息响应 | 请求已接收,正在处理 | “先等着,还没完” |
| 2xx | 成功 | 请求被成功处理 | “成了,没毛病” |
| 3xx | 重定向 | 需要再操作一步才能完成 | “这里没有,跟我走” |
| 4xx | 客户端错误 | 请求本身有问题 | “你的锅” |
| 5xx | 服务端错误 | 服务器处理不了 | “服务器的锅” |
记忆口诀:1 等 2 成 3 跳转,4 是你是 5 是它。
以后排查问题,先看第一位数字:
- 看到 4xx → 先查请求方:参数、认证、路径对不对
- 看到 5xx → 去查服务端:日志、资源、依赖服务
- 看到 3xx → 检查跳转配置:目标地址配得对不对
常用状态码速查
下面这些是工作中真正会遇到的码,按出场频率整理。
1xx 信息类:少见,但认识一下
| 100 | Continue | 继续发送请求体 | 大文件上传前的"先问一嘴" |
| 101 | Switching Protocols | 切换协议 | WebSocket 升级 |
2xx 成功类:看到就安心
| 200 | OK | 请求成功 | 绝大多数正常响应 |
| 201 | Created | 资源创建成功 | REST API 的 POST 创建成功 |
| 204 | No Content | 成功,但没有返回体 | DELETE 成功、纯状态更新 |
3xx 重定向类:最容易踩坑的一类
| 301 | Moved Permanently | 永久迁移,搜索引擎会更新索引 | 域名更换、HTTP 换 HTTPS |
| 302 | Found | 临时跳转,原地址仍然有效 | A/B 测试、临时活动页 |
| 304 | Not Modified | 缓存命中,直接用本地副本 | 静态资源加速、省带宽 |
| 307 | Temporary Redirect | 临时跳转,保持原请求方法 | 需要保留 POST 的跳转 |
| 308 | Permanent Redirect | 永久跳转,保持原请求方法 | POST 接口的永久迁移 |
4xx 客户端错误类:先检查自己
| 400 | Bad Request | 请求参数或格式有问题 | JSON 格式错、缺参数 |
| 401 | Unauthorized | 没登录或身份凭证无效 | token 缺失、过期 |
| 403 | Forbidden | 登录了,但没权限 | 普通用户访问管理页 |
| 404 | Not Found | 资源不存在 | 路径写错、资源已删 |
| 405 | Method Not Allowed | 请求方法不支持 | 对只读接口发 POST |
| 408 | Request Timeout | 请求超时 | 网络慢、客户端发送太慢 |
| 413 | Payload Too Large | 请求体太大 | 上传文件超限 |
| 429 | Too Many Requests | 请求太频繁,被限流 | 爬虫太快、触发 API 限流 |
5xx 服务端错误类:值班人的噩梦
| 500 | Internal Server Error | 服务器内部错误,兜底码 | 未捕获异常、代码 bug |
| 501 | Not Implemented | 功能未实现 | 服务器不支持该方法 |
| 502 | Bad Gateway | 网关从上游收到了无效响应 | 后端挂了、上游返回异常 |
| 503 | Service Unavailable | 服务暂时不可用 | 过载、正在发布 |
| 504 | Gateway Timeout | 网关等上游响应超时 | 后端处理太慢、慢查询 |
最容易搞混的三对
301 vs 302:永久 vs 临时
| SEO 影响 | 搜索引擎收录新地址 | 搜索引擎保留原地址 |
| 浏览器缓存 | 会被强缓存,改起来麻烦 | 默认不缓存 |
| 适用场景 | 域名迁移、HTTP 转 HTTPS | 临时跳转、A/B 测试 |
⚠️ 踩坑提醒:301 用错地方会被浏览器缓存,之后就算服务端改回来,用户浏览器照样跳到错误地址。测试时一定要清缓存。
401 vs 403:没登录 vs 不让进
- 401:“你是谁?”——没有认证或 token 失效。处理:重新登录、刷新 token。
- 403:“我知道你是谁,但你不能进。”——认证通过了,权限不够。处理:检查角色和权限配置。
502 vs 504:后端挂了 vs 后端太慢
| 含义 | 上游返回无效响应或直接拒绝连接 | 上游在规定时间内没响应 |
| 常见原因 | 后端进程挂了、端口没监听 | 后端处理太慢、慢查询 |
| 排查方向 | 后端进程活着吗?端口通吗? | 后端日志、慢查询、超时配置 |
一句话记忆:502 是"人没了",504 是"人还在,但太慢了"。
实战排查:我的三板斧
平时遇到问题,我会先用 curl 看第一手响应,比盯着浏览器的报错页面直接得多:
# 只看响应头和状态码
curl -I https://example.com/api
# 只输出状态码,方便写进脚本
curl -s -o /dev/null -w "%{http_code}\\n" https://example.com/api
排查三步走:
说到查码,分享一个习惯:遇到不认识的状态码,别一篇一篇翻搜索出来的博客,结果里经常混着过时信息。我现在是直接打开在线速查表搜,比如我收藏的这个 HTTP 状态码速查表,输入状态码数字或者"未找到"这类关键词就能实时过滤,点一下状态码还能直接复制,贴到日志和文档里很方便。1xx 到 5xx 全覆盖,中英文解释都有,平时想不起来就查一下,不用硬背。
常见问题
Q:需要把 60 多个状态码全背下来吗? A:不需要。上面速查表里的 20 多个覆盖了 99% 的场景。像 418(I’m a teapot)这种是愚人节玩笑 RFC 里的,见到了知道有这么回事就行。
Q:Nginx 里的 499、Cloudflare 的 520 是什么? A:这些是厂商扩展码,不是官方标准。499 在 Nginx 里表示"客户端主动断开连接",520~529 是 Cloudflare 自家的错误码。遇到再学,不用提前背。
Q:接口出错了,返回 200 再在 JSON 里写错误码行不行? A:不建议。HTTP 状态码是给机器看的标准语义,一律返回 200 会让网关、缓存、监控全部失效。出错了就返回对应的 4xx/5xx,详细信息放响应体里。
Q:302 和 307 都是临时重定向,区别在哪? A:历史上 302 会被浏览器把 POST 改成 GET,307 明确要求保持原请求方法。现代浏览器里 GET 场景两者基本一致,需要重定向 POST 请求时用 307 更稳。
总结
HTTP 状态码是客户端和服务器之间的通用语言,学会这门语言是开发者性价比最高的投入之一:
✅ 记住口诀:1 等 2 成 3 跳转,4 是你是 5 是它 ✅ 掌握 20+ 常用码,覆盖 99% 的场景 ✅ 分清三对易混码:301/302、401/403、502/504 ✅ 4xx 查客户端,5xx 查服务端,一秒定责 ✅ 记不住就查速查表,别猜,也别硬背
下次再遇到报错码,不用慌,看一眼就知道问题在哪。
参考资料
- RFC 9110 HTTP Semantics(状态码的官方定义)
- MDN Web Docs:HTTP 状态码
- IANA HTTP Status Code Registry(官方注册表)
- HTTP 状态码速查表:https://leowh.com/tools/http-status/index.html





