去年帮一个做外贸的朋友修网站,他在群里发来张截图:页面白屏,底下一行英文"500 Internal Server Error"。他自己百度了一圈,把 DNS、防火墙、备案挨个怀疑了一遍,甚至准备给机房打电话。我远程一看,其实是服务器上 PHP 升级后有个函数被废弃,报错堆栈里写得明明白白。他缺的不是技术,是不知道"500"这三个数字本身就是服务器递出来的小纸条——纸条上已经写好了问题出在哪一层。
状态码是服务器写给请求方的回执
HTTP 状态码是服务器对每次请求的回答,由三位数字组成:第一位代表类别,后两位是细分。200 是 2 开头(成功类),404 是 4 开头(客户端错误类)。看懂第一位数字,排错的大方向就定了。
状态码按第一位分五类,排错思路完全不同。1xx 是信息,请求还在协商,用户一般看不到,比如 100 Continue 表示接着发。2xx 是成功,请求被正常处理,200 OK 最常见,还有 201 创建成功、204 返回了空内容。3xx 是重定向,资源挪地方了让你去别处找:301 永久搬家(浏览器会更新书签),302 临时跳转,304 是内容没变直接用缓存。4xx 是客户端错误,问题在请求这一侧——404 找不到、401 没登录、403 没权限、429 请求太频繁。5xx 是服务器错误,请求没问题,是服务器自己没搞定——500 内部错误、502 网关出错、503 服务不可用、504 网关超时。
七个最常见的,说人话
| 状态码 | 人话解释 | 常见场景 |
|---|---|---|
| 200 | 成功,一切正常 | 页面正常打开 |
| 301 | 永久搬家 | 域名换新地址,旧地址转过去 |
| 302 | 临时跳转 | 未登录先跳到登录页 |
| 404 | 找不到 | 地址拼错、页面被删 |
| 500 | 服务器内部错误 | 程序代码出 bug |
| 502 | 网关出错 | nginx 后面的应用挂了 |
| 503 | 服务暂不可用 | 服务器过载或维护中 |
看到状态码,按这个顺序排错
先看是 4 还是 5:4 开头检查自己的 URL、参数、请求头和登录态;5 开头查服务器日志、进程是否存活、依赖服务是否正常。查清楚含义再动手,打开站里的HTTP状态码速查输入数字,确认它到底在说什么,别凭感觉猜。然后看响应体和日志,很多框架会在响应里附带错误详情,浏览器按 F12 打开开发者工具,在 Network 面板点开那条请求,答案往往直接写在里面。5xx 优先查最近改动——上线前好好的,上线后 500,先怀疑刚部署的代码和配置,排错第一步永远是"最近变过什么"。
三对最容易搞混的
401 和 403:401 是"你没登录",403 是"登录了但没权限",前者补登录,后者找管理员。404 和 410:404 是"这里没有",410 是"曾经有,现在没了"。502 和 504:502 是"上游说错话了",504 是"上游半天不回话",一个是答非所问,一个是等不到回应。
顺带说一句状态码和搜索引擎的关系。301 永久重定向做对了,搜索引擎会把旧链接的权重转移给新地址,收录也慢慢更新;如果该用 301 却用了 302,引擎可能一直以为这是临时跳转,权重传递不彻底。所以换域名、改 URL 结构时,301 是标准做法。开发者这边也一样,接口出错该返什么就返什么,别一刀切全返 200 再把错误塞进响应体,那会让前端和排查都摸不着头脑。
状态码不是给搜索引擎看的玄学,是服务器写的回执。背下来没必要,但"4 开头查自己、5 开头查后端"这条原则值得记一辈子——它能把大多数"网站打不开"从玄学变成科学。