🕸️ 第二章 Web特有的架构
📄 一句话概括

响应的第一行是一个三位数,第一位就决定了这次是顺利、是改道、还是出错——这也是排查问题时最先要看的东西。

📝 本节和前面几节的关系

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 秒实验

  1. 随便打开一个不存在的地址,比如把某个网站域名后面加一串乱码,回车。
  2. 按 F12 打开 Network 面板,找到那一条,看它的状态码是不是 404。
  3. 再随便挑一个你打开过的、需要登录的网站,在退出登录后再打开个人页面,看看状态码变成了几。

常见误区

  1. 错误:出错了就是对方服务器的问题。——纠正:先看第一位是 4 还是 5。4 开头是这一侧的问题(地址、权限、参数),5 开头才是对方的问题。分不清楚就会做无用功:明明是网址写错了,你还一直刷新。
  2. 错误:404 都是用户打错网址造成的。——纠正:大头来自爬虫和失效的外链。真实站点的 404 往往占两到三成,这个比例更像是一份【网站改版没做好跳转】的体检报告,而不是用户手滑的证据。
  3. 错误:状态码只是给浏览器看的。——纠正:搜索引擎、监控系统、CDN、负载均衡都在读它。同一个状态码,爬虫要不要继续抓、监控要不要报警、缓存要不要留,全都不一样。所以它是给一整套系统看的。
  4. 错误:重定向都是 301,写哪个都一样。——纠正:301 是永久、302 是临时,语义不同;而且它们可能把请求方法改掉。需要保住方法的时候要用 307 或 308——这在表单提交的场景里会把结果彻底带偏。
自测三问(点开对答案) 1. 看到一个状态码,第一步该看什么? —— **看第一位**。它一次性告诉你责任在哪边:2 顺利、3 改道、4 你这边、5 我这边。**这一步判断可以省掉大量瞎试**——5 开头的问题,你这边怎么改都没用。 2. 为什么真实的 404 比例会那么高? —— 因为**它的主要来源不是人,是机器**:爬虫还记着旧地址、外链指向已删除的页面、资源改过名之后没做跳转。**所以这个数字更像是网站自己的一份体检报告**,反映的是改版管理做得好不好。 3. 为什么教材要在这里单独讲状态码? —— 因为**它是整套排查方法的入口**。下一节讲开发者工具,第一眼看的就是这一列;再往后讲安全(第九章)、讲运维,也都要回到这五个数字上。**先能把结论读出来,再谈怎么找原因。**

相关笔记