跳到正文

HTTP 状态码速查

HTTP Status Reference

逐条解释状态码在规范里的含义、缓存行为,以及人们常犯的误用。

一份可搜索的 HTTP 状态码参考——每个码的含义、由哪份 RFC 定义、缓存默认能不能存它、必须和哪个响应头一起发送。搜索匹配码、名称和摘要,可以用英语、韩语、日语、简体中文和西班牙语查,中文收的是「认证」「未找到」这类常用说法。

🔒 完全在你的浏览器里运行httpstatusreference

代码、名称、摘要和备注一起搜。能用的语言:英语、韩语、日语、简体中文和西班牙语。

类别

404 Not Found

404Not Found

这个 URL 上没有资源。

客户端错误——错在请求这边。原样重试还是同样的失败。

定义在
RFC 9110 §15.5.5
默认是否可缓存
是

默认可缓存 —— 头一回看见 CDN 对一个明明已经存在的页面一直返回 404 时,谁都会吃一惊。

62个里的 62个

所有 HTTP 状态码及其含义。
码名称含义可缓存
100Continue客户端可以接着把请求正文发过来。否
101Switching Protocols服务器正在切换到客户端要求的协议。否
102ProcessingWebDAV:请求正在处理中。否
103Early Hints先给出的一批标头,让客户端在真正的响应之前就开始预加载。否
200OK请求成功了。是
201Created新建了一个资源。否
202Accepted请求收下了,但还没动手做。否
203Non-Authoritative Information中转的代理改动了它转发的响应。是
204No Content成功,而且故意不带正文。是
205Reset Content成功;客户端应该把刚提交的表单清空。否
206Partial Content这是要的那段字节。是
207Multi-StatusWebDAV:一个 XML 正文,每个子请求各有一个状态。否
208Already ReportedWebDAV:这个成员前面已经列过了。否
226IM Used这个响应是施加了实例操作之后的结果。否
300Multiple Choices存在几种表示形式,挑一个。是
301Moved Permanently这个资源换了新的 URL,而且是永久的。是
302Found临时的重定向。否
303See Other用 GET 去取另一个 URL。否
304Not Modified缓存里的那份还能用。否
305Use Proxy已废弃:本意是客户端应该改用指定的代理。否
307Temporary Redirect保留原方法的临时重定向。否
308Permanent Redirect保留原方法的永久重定向。是
400Bad Request请求的格式坏了,服务器不会处理它。否
401Unauthorized需要认证,或者给出的凭据被拒绝了。否
402Payment Required保留下来的号码,从来没有被赋予含义。否
403Forbidden服务器听懂了,然后拒绝。否
404Not Found这个 URL 上没有资源。是
405Method Not AllowedURL 是有的,只是这个方法在它身上不适用。是
406Not Acceptable服务器能给出的东西,没有一样对得上 `Accept` 标头。否
407Proxy Authentication Required代理要凭据。否
408Request Timeout客户端把请求发完花的时间太久了。否
409Conflict这个请求和当前的状态冲突。否
410Gone这里本来有,而且是有意不再回来了。是
411Length Required必须带 `Content-Length` 标头。否
412Precondition Failed`If-Match` 或 `If-Unmodified-Since` 的条件没满足。否
413Content Too Large正文比服务器肯收的还大。否
414URI Too LongURL 比服务器肯收的还长。是
415Unsupported Media Type正文的 `Content-Type` 不是服务器能处理的那几种。否
416Range Not Satisfiable要的那段范围落在资源之外。否
417Expectation Failed`Expect` 标头提的要求满足不了。否
418I'm a teapot1998 年愚人节的一个玩笑,从此再没走掉。否
421Misdirected Request这台服务器没法为这个 authority 生成响应。否
422Unprocessable Content格式没问题,意思上不对。否
423LockedWebDAV:这个资源被锁住了。否
424Failed DependencyWebDAV:这一串里前面的某个请求失败了。否
425Too Early服务器不愿冒险重放一个早期数据请求。否
426Upgrade Required客户端必须换协议。否
428Precondition Required服务器要求这个请求必须是带条件的。否
429Too Many Requests被限流了。否
431Request Header Fields Too Large标头太大了。否
451Unavailable For Legal Reasons因法律要求被拦下。是
500Internal Server Error出了岔子,而服务器说不出更具体的东西。否
501Not Implemented服务器根本不支持这个方法。是
502Bad Gateway上游服务器发回了不合法的东西。否
503Service Unavailable暂时处理不了这个请求。否
504Gateway Timeout上游服务器没在规定时间内回话。否
505HTTP Version Not Supported请求里写的那个 HTTP 版本不被支持。否
506Variant Also Negotiates内容协商配置错了。否
507Insufficient StorageWebDAV:没有足够的地方存这份表示。否
508Loop DetectedWebDAV:处理过程中陷入了死循环。否
510Not Extended还需要别的扩展。否
511Network Authentication Required强制门户要你先登录。否

容易混淆的那几对

401 的意思是“我不知道你是谁” —— 带上凭据再来一次。403 的意思是“我知道你是谁,答案是不行”。凭据有效但权限不够,那就是 403。
400 给服务器读不懂的请求;422 给它读得明明白白、但不认同的请求。422 换个数据还能再试,400 通常意味着客户端本身有毛病。
第一条轴是永久性(301/308 永久,302/307 临时),第二条轴是方法保留(307/308 保留方法,301/302 历来不保留)。在 API 上拿不准,就用 307 或 308。
两个都来自代理,不是你的应用。502 是“上游答了些没意义的东西,或者干脆死了”;504 是“上游始终没答”。后者是你能调的超时,前者是你必须修的故障。
两个都表示那里什么也没有。410 还额外表示它再也不会回来,而搜索引擎对这句话的反应是几天,不是几个月。
405 是“这个 URL 上不行,行的是这些” —— 而且必须发 `Allow` 标头。501 是“这台服务器在任何地方都没实现那个方法”。
这里说的“可缓存”,意思是启发式地可以缓存。RFC 9110 §15.1 列出了在没有别的指示时缓存可以存下来的那些码。404 也在那张单子上 —— 你早就发布了的页面,CDN 却还在一直回 404,就是这么来的。

怎么用

  1. 搜索或按类别筛选

    输入数字、名称,或你遇到的问题——"gateway"、"unauthorized"、"rate limit"。中文也一样:"认证"能找到 401,"未找到"能找到 404,"限流"能找到 429。或者收窄到 4xx 往下读。

  2. 打开一个看详情

    详情面板给出定义它的规范、它是否可以启发式缓存,以及响应必须携带的响应头——没有 `Allow` 的 405 和没有 `Location` 的 301 都是不完整的。

  3. 读易混淆的几对

    底部那一节覆盖了常被选错的几对:401 对 403、302 对 307、502 对 504。

常见问题

401 和 403 有什么区别?

401 表示请求没有有效凭据,而且必须带一个说明如何提供凭据的 `WWW-Authenticate` 头。403 表示凭据被理解了但不够。给一个已登录却没有权限的用户返回 401 是常见的错误。

为什么我的 CDN 缓存了 404?

因为它可以。RFC 9110 §15.1 列出了在没有别的指示时缓存可以启发式存储的状态码,404 在其中。你后来发布的页面会一直是「未找到」,直到缓存过期或你手动清除——对一个你预期会变成 200 的 404,发 `Cache-Control: no-store`。

302 还是 307?

想保留方法就用 307。历史上客户端在 302 时会把 POST 变成 GET——规范没这么说,但大家都这么做——所以 307 和 308 的存在就是为了毫不含糊地表示「同样的方法,新的 URL」。

我能自己发明状态码吗?

你想发什么都可以,客户端会把不认识的码当作它所属类别的通用成员——499 按 400 处理。但缓存、代理和库都按类别做决定,所以一个未注册的码给你带来的东西,没有一样是一个响应头不能更好地承载的。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。