HTTP 状态码查询 — 404、502、429 各自到底承诺了什么

输入一个状态码,或者粘贴一行响应头、一段日志,页面会给出这个数字属于哪一段、服务端在什么时候产生它、客户端紧接着会做什么,以及第一件事该查哪里;还会直接回答“这个请求能不能重发”。200 与 204、301/302/303/307/308 的差别、整个 4xx 家族、502 与 504 的分界都在内。全部在浏览器本地完成。

B · 表里收录的全部状态码

点一行就直接查它

第一位数字带着什么

一个状态码背着三件事

一个状态码同时背着三件事:服务端认为自己完成了什么、客户端紧接着该做什么、以及这算谁的故障。赶时间的时候人会把这三件事全读成一个数字,于是 401 被说成权限问题,304 被说成缓存失效,502 被说成“网站挂了”。

查询拿到一个码——你打进去的,或者从你粘过来的状态行、日志片段里抠出来的——就把三件事摊平了:它属于哪一段、服务端什么时候会给出它、客户端随后立刻做了什么、以及第一件事值得查哪里。第四栏回答的是最贵的那个问题:这个请求能不能重发。

意义在第一位数字上

只有首位数字是被保证有意义的,协议真正定义了行为的是那五段:

  • 1xx 不是答复,它在请求里面,浏览器永远不会把它给你看。
  • 2xx 是服务端接受了这个请求。不等于你想要的发生了:正文是错误页的 200,以及一小时后任务失败的 202,都是诚实的 2xx。
  • 3xx 是要多做一步,四个变种只在两个维度上有别:永久还是临时,动词和正文要不要原样带过去。301 和 308 会被客户端记住,302 和 307 不会;303 强制改成 GET,307 和 308 禁止改。
  • 4xx 是服务端拒绝拿这个请求做任何事。它对“你有没有办法让请求成功”一言未发。
  • 5xx 是请求没问题而服务端办不成。注意:站在一台负载均衡后面的站点,你看到的 5xx 很可能是前面那台机器生成的,不是应用写的。

粘贴进来的那一行怎么读

文本框接受状态行(HTTP/1.1 302 Found、HTTP/2 204)、日志片段("GET /api/cart HTTP/1.1" 502 0),或者任何含有孤立三位数字的文字。可信度顺序是:

  1. 真的状态行优先,它后面的原因短语会拿来和登记的名字对照。短语是自由文本——404 Not Found 和 404 MISSING 对所有客户端是同一件事,被读的只有数字。
  2. 否则取第一个独立成段的三位数,并且提示会说明它是怎么来的。字节数和端口通常埋在一长串数字里,靠边界判断就不会把 1024 或 2026-10-03 误当状态码;真撞上同名的情况也会写在提示里而不是瞒下来。
  3. 状态码框同时有内容时以框为准,因为打字是主动行为。两边不一致时,提示会写清用的是哪一个。

框里出现 URL 什么也不会发生:那个地址不会被访问。

要不要再发一次

“能不能重发”只有四种答案,而且它属于这个码本身,不属于你当时的处境:

  • 可以,原样重发——408、425、502、504。服务端上一次并没有真的动手。
  • 要等 Retry-After 给的时间——429 和 503,等待本来就是这两个响应的全部用意。
  • 先确认有没有副作用——409、413、422、428、431、451、499、500、507、511 以及其他含糊的那些。请求可能执行了一半才失败,闭眼重发会把同一件事做两遍。
  • ———不存在这个问题(成功、重定向、信息性响应)。

这是码的性质,不是一句保证:一个发生在应用已经写库之后的 502,正是“可以重发”这个标签看不见的东西。

常见问题

Q:它会发请求去核对吗? 不会。运行的脚本里没有任何网络调用——查询走的是写在脚本里的一张码表。粘进来的 URL 只被当文字解析。

Q:499 不是标准码,为什么收进来? 因为大家每天在 nginx 日志里撞见它,而且它是“状态码可以描述观察者处境而不是客户端处境”的最清楚例子。“调用方先挂了电话”这件事,标准码里没有一个能表达。

Q:502 和 504 哪个更严重? 按协议都不严重:两个都是前面那一层生成的。502 是上游给了一个用不了的答复,504 是上游没来得及答复。哪个更要紧取决于上游是在反复崩溃还是仅仅慢——数字分不出这两者。

Q:我的码不在表里,是查询本身坏了吗? 不是。100 到 599 之间没收录的码仍然会拿到区段解释,那已经是一个陌生数字能被诚实支持的大部分内容。扩展码和各产品自定的码因厂商而异,替它们猜名字比直说更没用。

微信
微信
支付宝
支付宝