响应的第一行是一个三位数,第一位就决定了这次是顺利、是改道、还是出错——这也是排查问题时最先要看的东西。
2-6 讲的是客户端说什么,这一条讲服务器答什么。两条合起来才是一次完整的对话。状态码是这次对话的结论,也是本章里最实用的一小块知识:会看状态码,等于会给网站做最基本的体检。
一、五类状态码
状态码是三位数,第一位决定归类,后两位才是具体含义。所以记五个数字就够了:
1xx 还在处理,2xx 成了,3xx 去别处拿,4xx 你这边的问题,5xx 我这边的问题。
这里有一条特别有用的判据:出问题时,先看第一位是 4 还是 5。4 开头多半是自己地址写错了、没登录、没权限;5 开头就是对方服务器出了问题,你再刷新也没用。
二、真实站点的分布
教材给的是一套分类,但真实流量长什么样是另一回事。下面用两份公开的访问日志做对照:一份是小型站点,一份是大型站点。
三、动手 Demo:两份日志里的状态码
A = {"200": 69.04, "404": 30.18, "304": 0.34}
B = {"200": 79.01, "404": 20.49, "304": 0.05}
for c in ("200", "404", "304"):
print("%-4s %6.2f%% %6.2f%%" % (c, A[c], B[c]))
实跑输出:
--------------------------------------------------------------------
D7 Web 网站的 HTTP 响应:HTTP 响应、状态码
--------------------------------------------------------------------
响应的第一行是一个三位数,叫状态码。第一位决定它属于哪一类:
----------------------------------------------------------------------------------------
首位 类别 意思 常见例子
----------------------------------------------------------------------------------------
1xx 信息 还在处理,稍等 100 Continue
2xx 成功 拿到了 200 OK / 206 部分内容
3xx 重定向 去别的地方拿 301 / 302 / 304
4xx 客户端错 你这边有问题 400 / 401 / 403 / 404
5xx 服务器错 我这边有问题 500 / 502 / 503 / 504
----------------------------------------------------------------------------------------
再看真实站点的分布。下面是两份公开的访问日志:
----------------------------------------------------------------------------------------
状态码 站点 A(22 万次请求) 站点 B(2024 万次请求)
----------------------------------------------------------------------------------------
200 69.04% 79.01%
404 30.18% 20.49%
304 0.34% 0.05%
206 0.16% 0.09%
503 — 0.15%
403 0.10% 0.01%
408 — 0.12%
401 0.09% —
302 0.03% 0.01%
301 0.01% 0.07%
400 0.06% 0.01%
405 0.01% 0.00%
500 0.00% 0.00%
501 0.00% 0.00%
502 0.00% —
504 0.00% —
----------------------------------------------------------------------------------------
百分号是四舍五入到两位小数的,所以两列各自加起来未必正好 100;
破折号表示这份日志里没出现这个码。
两张表最值得看的是两点:
1. 200 占七成上下——绝大多数请求都是正常把内容拿走了。
2. 404 是稳稳的第二名,两成到三成。这些不是用户点错,
大头是爬虫在翻旧地址、外链失效、资源被改名。
真出错的时候,错误码里最常见的是这四个:
----------------------------------------------------------------------------------------
错误码 占所有错误 典型原因
----------------------------------------------------------------------------------------
404 40% 资源不存在
500 25% 服务器上的程序自己崩了
403 15% 文件在,但没权限看
502 10% 中间那台机器拿不到后面的回应
----------------------------------------------------------------------------------------
⚠️ 2026 现状:状态码这几年的变化不在数字,在用法——
301 与 302 之外,307 / 308 用来在重定向时保住请求方法;
410(资源已永久删除)比 404 更明确,正被更多站点用起来;
503 配上 Retry-After 头,是维护时告诉爬虫【过会儿再来】的标准做法。
读这个输出:200 一个码就占了七成上下——绝大多数请求都是正常把内容拿走了,这符合直觉。真正值得琢磨的是第二名:404 占到两成到三成。这些不是用户点错了——大头是爬虫在翻旧地址、外链失效、资源改过名。所以 404 比例高,往往说明的是网站改过版、但没有做好跳转。
四、出错了以后看什么
真正出事的时候,错误码里最常见的是四个:404(资源不存在)、500(服务器上的程序自己崩了)、403(文件在,但没权限看)、502(中间那台机器拿不到后面的回应)。
它们恰好覆盖了三种责任:404 是地址的问题、403 是权限的问题、500 和 502 是服务器自己或它身后那一层的问题。分清楚责任在哪边,才知道该找谁。
五、⚠️ 2026 现状
这几年状态码的变化不在数字,在用法:307 和 308 用来在重定向时保住请求方法(301 和 302 可能把 POST 变成 GET,这在表单场景里会出事);410(资源已永久删除)比 404 更明确,正在被更多站点用起来;503 配 Retry-After 头,成了维护时告诉爬虫【过会儿再来】的标准做法。
30 秒实验
- 随便打开一个不存在的地址,比如把某个网站域名后面加一串乱码,回车。
- 按 F12 打开 Network 面板,找到那一条,看它的状态码是不是 404。
- 再随便挑一个你打开过的、需要登录的网站,在退出登录后再打开个人页面,看看状态码变成了几。
常见误区
- 错误:出错了就是对方服务器的问题。——纠正:先看第一位是 4 还是 5。4 开头是这一侧的问题(地址、权限、参数),5 开头才是对方的问题。分不清楚就会做无用功:明明是网址写错了,你还一直刷新。
- 错误:404 都是用户打错网址造成的。——纠正:大头来自爬虫和失效的外链。真实站点的 404 往往占两到三成,这个比例更像是一份【网站改版没做好跳转】的体检报告,而不是用户手滑的证据。
- 错误:状态码只是给浏览器看的。——纠正:搜索引擎、监控系统、CDN、负载均衡都在读它。同一个状态码,爬虫要不要继续抓、监控要不要报警、缓存要不要留,全都不一样。所以它是给一整套系统看的。
- 错误:重定向都是 301,写哪个都一样。——纠正:301 是永久、302 是临时,语义不同;而且它们可能把请求方法改掉。需要保住方法的时候要用 307 或 308——这在表单提交的场景里会把结果彻底带偏。
自测三问(点开对答案)
1. 看到一个状态码,第一步该看什么? —— **看第一位**。它一次性告诉你责任在哪边:2 顺利、3 改道、4 你这边、5 我这边。**这一步判断可以省掉大量瞎试**——5 开头的问题,你这边怎么改都没用。 2. 为什么真实的 404 比例会那么高? —— 因为**它的主要来源不是人,是机器**:爬虫还记着旧地址、外链指向已删除的页面、资源改过名之后没做跳转。**所以这个数字更像是网站自己的一份体检报告**,反映的是改版管理做得好不好。 3. 为什么教材要在这里单独讲状态码? —— 因为**它是整套排查方法的入口**。下一节讲开发者工具,第一眼看的就是这一列;再往后讲安全(第九章)、讲运维,也都要回到这五个数字上。**先能把结论读出来,再谈怎么找原因。**- ☐ 下一节(2-8 确认HTTP消息:开发者工具)
相关笔记
- Web网站的HTTP请求 —— 上一节:这次对话的前半句
- 传输Web网站的文件(HTTP响应) —— 网络课里的响应
- 浏览Web网站时执行的处理 —— 一次访问的完整流程
- 🕸️ Web技术原理 · 索引