HTTP 状态码速查
HTTP Status Reference
逐条解释状态码在规范里的含义、缓存行为,以及人们常犯的误用。
一份可搜索的 HTTP 状态码参考——每个码的含义、由哪份 RFC 定义、缓存默认能不能存它、必须和哪个响应头一起发送。搜索匹配码、名称和摘要,可以用英语、韩语、日语、简体中文和西班牙语查,中文收的是「认证」「未找到」这类常用说法。
代码、名称、摘要和备注一起搜。能用的语言:英语、韩语、日语、简体中文和西班牙语。
404 Not Found
404Not Found
这个 URL 上没有资源。
客户端错误——错在请求这边。原样重试还是同样的失败。
RFC 9110 §15.5.5默认是否可缓存
是
默认可缓存 —— 头一回看见 CDN 对一个明明已经存在的页面一直返回 404 时,谁都会吃一惊。
62个里的 62个
| 码 | 名称 | 含义 | 可缓存 |
|---|---|---|---|
| 100 | Continue | 客户端可以接着把请求正文发过来。 | 否 |
| 101 | Switching Protocols | 服务器正在切换到客户端要求的协议。 | 否 |
| 102 | Processing | WebDAV:请求正在处理中。 | 否 |
| 103 | Early Hints | 先给出的一批标头,让客户端在真正的响应之前就开始预加载。 | 否 |
| 200 | OK | 请求成功了。 | 是 |
| 201 | Created | 新建了一个资源。 | 否 |
| 202 | Accepted | 请求收下了,但还没动手做。 | 否 |
| 203 | Non-Authoritative Information | 中转的代理改动了它转发的响应。 | 是 |
| 204 | No Content | 成功,而且故意不带正文。 | 是 |
| 205 | Reset Content | 成功;客户端应该把刚提交的表单清空。 | 否 |
| 206 | Partial Content | 这是要的那段字节。 | 是 |
| 207 | Multi-Status | WebDAV:一个 XML 正文,每个子请求各有一个状态。 | 否 |
| 208 | Already Reported | WebDAV:这个成员前面已经列过了。 | 否 |
| 226 | IM Used | 这个响应是施加了实例操作之后的结果。 | 否 |
| 300 | Multiple Choices | 存在几种表示形式,挑一个。 | 是 |
| 301 | Moved Permanently | 这个资源换了新的 URL,而且是永久的。 | 是 |
| 302 | Found | 临时的重定向。 | 否 |
| 303 | See Other | 用 GET 去取另一个 URL。 | 否 |
| 304 | Not Modified | 缓存里的那份还能用。 | 否 |
| 305 | Use Proxy | 已废弃:本意是客户端应该改用指定的代理。 | 否 |
| 307 | Temporary Redirect | 保留原方法的临时重定向。 | 否 |
| 308 | Permanent Redirect | 保留原方法的永久重定向。 | 是 |
| 400 | Bad Request | 请求的格式坏了,服务器不会处理它。 | 否 |
| 401 | Unauthorized | 需要认证,或者给出的凭据被拒绝了。 | 否 |
| 402 | Payment Required | 保留下来的号码,从来没有被赋予含义。 | 否 |
| 403 | Forbidden | 服务器听懂了,然后拒绝。 | 否 |
| 404 | Not Found | 这个 URL 上没有资源。 | 是 |
| 405 | Method Not Allowed | URL 是有的,只是这个方法在它身上不适用。 | 是 |
| 406 | Not Acceptable | 服务器能给出的东西,没有一样对得上 `Accept` 标头。 | 否 |
| 407 | Proxy Authentication Required | 代理要凭据。 | 否 |
| 408 | Request Timeout | 客户端把请求发完花的时间太久了。 | 否 |
| 409 | Conflict | 这个请求和当前的状态冲突。 | 否 |
| 410 | Gone | 这里本来有,而且是有意不再回来了。 | 是 |
| 411 | Length Required | 必须带 `Content-Length` 标头。 | 否 |
| 412 | Precondition Failed | `If-Match` 或 `If-Unmodified-Since` 的条件没满足。 | 否 |
| 413 | Content Too Large | 正文比服务器肯收的还大。 | 否 |
| 414 | URI Too Long | URL 比服务器肯收的还长。 | 是 |
| 415 | Unsupported Media Type | 正文的 `Content-Type` 不是服务器能处理的那几种。 | 否 |
| 416 | Range Not Satisfiable | 要的那段范围落在资源之外。 | 否 |
| 417 | Expectation Failed | `Expect` 标头提的要求满足不了。 | 否 |
| 418 | I'm a teapot | 1998 年愚人节的一个玩笑,从此再没走掉。 | 否 |
| 421 | Misdirected Request | 这台服务器没法为这个 authority 生成响应。 | 否 |
| 422 | Unprocessable Content | 格式没问题,意思上不对。 | 否 |
| 423 | Locked | WebDAV:这个资源被锁住了。 | 否 |
| 424 | Failed Dependency | WebDAV:这一串里前面的某个请求失败了。 | 否 |
| 425 | Too Early | 服务器不愿冒险重放一个早期数据请求。 | 否 |
| 426 | Upgrade Required | 客户端必须换协议。 | 否 |
| 428 | Precondition Required | 服务器要求这个请求必须是带条件的。 | 否 |
| 429 | Too Many Requests | 被限流了。 | 否 |
| 431 | Request Header Fields Too Large | 标头太大了。 | 否 |
| 451 | Unavailable For Legal Reasons | 因法律要求被拦下。 | 是 |
| 500 | Internal Server Error | 出了岔子,而服务器说不出更具体的东西。 | 否 |
| 501 | Not Implemented | 服务器根本不支持这个方法。 | 是 |
| 502 | Bad Gateway | 上游服务器发回了不合法的东西。 | 否 |
| 503 | Service Unavailable | 暂时处理不了这个请求。 | 否 |
| 504 | Gateway Timeout | 上游服务器没在规定时间内回话。 | 否 |
| 505 | HTTP Version Not Supported | 请求里写的那个 HTTP 版本不被支持。 | 否 |
| 506 | Variant Also Negotiates | 内容协商配置错了。 | 否 |
| 507 | Insufficient Storage | WebDAV:没有足够的地方存这份表示。 | 否 |
| 508 | Loop Detected | WebDAV:处理过程中陷入了死循环。 | 否 |
| 510 | Not Extended | 还需要别的扩展。 | 否 |
| 511 | Network 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 是“这台服务器在任何地方都没实现那个方法”。
怎么用
搜索或按类别筛选
输入数字、名称,或你遇到的问题——"gateway"、"unauthorized"、"rate limit"。中文也一样:"认证"能找到 401,"未找到"能找到 404,"限流"能找到 429。或者收窄到 4xx 往下读。
打开一个看详情
详情面板给出定义它的规范、它是否可以启发式缓存,以及响应必须携带的响应头——没有 `Allow` 的 405 和没有 `Location` 的 301 都是不完整的。
读易混淆的几对
底部那一节覆盖了常被选错的几对: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 处理。但缓存、代理和库都按类别做决定,所以一个未注册的码给你带来的东西,没有一样是一个响应头不能更好地承载的。
可以从这些接进来
MIME 类型查询
MIME Type Lookup
由扩展名查 MIME 类型或反过来查,也能直接从文件字节嗅探类型。
HTTP 响应头检测
HTTP Header Inspector
请求一个网址,列出完整的响应头、跳转链路、各段耗时和实际用到的压缩方式。
JSON 格式化与校验
JSON Formatter & Validator
把 JSON 美化成缩进形式或压成一行,校验语法并直接指出出错的行和列。
YAML 格式化与校验
YAML Formatter & Validator
统一 YAML 缩进并校验语法,把会让解析器崩掉的制表符和锚点错误标出来。
接下来
这些工具吃得下当前工具的产出,结果可以直接送过去。
HTTP 请求调试
HTTP Request Builder
构造并发出带自定义请求头和请求体的 GET/POST/PUT/PATCH/DELETE/HEAD 请求,显示状态码、响应头、响应体和耗时,且从不转发 Cookie 和 Authorization。
HTTP 响应头检测
HTTP Header Inspector
请求一个网址,列出完整的响应头、跳转链路、各段耗时和实际用到的压缩方式。
MIME 类型查询
MIME Type Lookup
由扩展名查 MIME 类型或反过来查,也能直接从文件字节嗅探类型。
Base64 编码解码
Base64 Encoder & Decoder
对文本和文件做 Base64 与 Base64URL 编解码,UTF-8 处理正确。
curl 转代码
curl to Code
把一条 curl 命令转成 fetch、axios、Python requests、Go、PHP 或 PowerShell 代码。
文本哈希计算
Text Hash
算出字符串的 MD5、SHA-1、SHA-256、SHA-384、SHA-512 和 CRC-32,输出可选大写或 Base64。