HTTP 状态码速查:404、502 等怎么看
广告位(预留,AdSense 审核通过后启用)
打开网页看到“404”,接口调用返回“502”,运维群里有人说“又是 5 开头的”。HTTP 状态码是服务器给每个请求的“回执”,读懂它能让排查少绕很多弯。本文不追求列全,而是讲最常见的十几个码、容易混淆的几组区别,以及遇到问题时的处理顺序。
一、先记住五大类
状态码是三位数字,第一位决定大类:
| 开头 | 含义 |
|---|---|
| 1xx | 信息,请求还在处理 |
| 2xx | 成功 |
| 3xx | 重定向,需要换个地址或用缓存 |
| 4xx | 客户端的问题(请求本身有误) |
| 5xx | 服务器的问题(请求没错但处理失败) |
这个分类来自 HTTP 语义规范 RFC 9110。排查的第一步永远是看第一位:4 开头先查自己发出的请求,5 开头先找服务端或中间的网关。
二、2xx:成功也有区别
- 200 OK:请求成功,通常带内容。
- 201 Created:成功创建了新资源,常见于新增数据的接口。
- 204 No Content:成功,但没有内容可返回,常用于删除或保存。如果你的前端对 204 去解析 JSON,就会报错,因为本来就没有内容。
三、3xx:重定向,别只看数字
重定向的响应会带一个 Location 头,告诉你去哪里。常见的几个:
- 301:永久移动。搜索引擎和浏览器会记住新地址。
- 302:临时移动,旧地址以后还会用。
- 307 / 308:分别是临时和永久,区别在于不允许把请求方法改成 GET。按规范,301 和 302 在某些情况下允许把 POST 变成 GET,所以需要保留 POST 的场景应使用 307 或 308。
- 304 Not Modified:不是出错。浏览器带着缓存标记问服务器“我这份还能用吗”,服务器回答“没变”,于是直接使用本地缓存。
网站改版换域名,需要保留搜索权重时,用 301 或 308;活动页临时跳转,用 302 或 307。具体细节可查 MDN 的重定向指南。
四、4xx:请求本身出了问题
- 400 Bad Request:请求格式有误,比如 JSON 少了括号、参数缺失。先用 JSON 格式化工具 检查请求体。
- 401 Unauthorized:没有通过身份认证,常见原因是没带令牌或令牌过期。过期问题可以用 时间戳转换工具 把令牌里的过期时间转成日期看看。
- 403 Forbidden:服务器知道你是谁,但不允许你访问。可能是账号权限不够,也可能是来源地址被限制。
- 404 Not Found:找不到资源。检查网址拼写、大小写和路径,也要留意网址里的中文有没有被正确编码,见 URL 编码一文。
- 405 Method Not Allowed:这个地址不支持你用的方法,例如该用 POST 却用了 GET。
- 429 Too Many Requests:请求太频繁被限流。看响应里有没有
Retry-After,按提示等待后再试,别在循环里不停重试。
最容易混淆的是 401 和 403:401 是“你是谁”没确认,403 是“确认了你,但不行”。登录前访问受保护页面多是 401,登录后访问没权限的页面多是 403。
五、5xx:服务端或网关的问题
- 500 Internal Server Error:服务端程序出错,需要看服务端日志。
- 502 Bad Gateway:网关(如 Nginx、负载均衡)收到了上游服务无效的响应,常见于后端程序崩溃或没启动。
- 503 Service Unavailable:服务暂时不可用,如正在维护或过载,可能带
Retry-After。 - 504 Gateway Timeout:网关等不到上游的响应,超时了,常见于后端处理太慢。
502 和 504 的区别可以这样记:502 是上游“回了句看不懂的话”或连不上,504 是上游“半天没吭声”。
六、用 curl 自己看一眼
浏览器会自动处理跳转和缓存,容易遮住真相。用命令行可以直接看回执:
curl -I https://example.com/
curl -sS -o /dev/null -w "%{http_code}\n" URL
curl -IL URL # 跟随跳转并显示每一跳
第一条只看响应头,第二条只输出状态码,第三条能看清重定向链。把示例中的网址换成你要测试的地址即可。
七、一个排查顺序
- 看第一位数字,确定是请求问题还是服务端问题。
- 用 curl 复现,排除浏览器缓存、插件的干扰。
- 4xx:核对网址、方法、请求头、令牌、请求体。
- 5xx:看服务端和网关日志,确认后端进程是否在运行,再看有没有超时设置。
- 仍不确定时,保存请求头和响应头,再去问相关负责人。
本文只讲通用含义,各网站和云服务可能自定义状态码的具体提示,请以官方文档为准。
八、几个常被问到的问题
- 页面能打开,状态码却是 404?有些网站自定义了错误页,但没有返回正确的状态码,这会影响搜索引擎判断,属于“软 404”,建议让错误页返回真正的 404。
- 接口返回 200,里面却写着“失败”?这是业务自己约定的错误码,与 HTTP 状态码无关,要看接口文档。
- 偶尔 502,刷新又好了?多见于后端重启、实例切换或某个节点异常,建议记录出现的时间,对照服务端日志查看。