MiServe DevTools

我的贴纸

把工具固定在这里,会保存在此浏览器中。

HTTP 状态码参考

从 100 到 511 的 HTTP 状态码,逐一说明它对开发者意味着什么、由哪份 RFC 定义,另附 nginx、Cloudflare 等产品使用的非标准状态码。

共 78 个状态码。

1xx 信息响应

服务器已收到请求,仍在处理中。这类是临时响应,在最终响应之前发送。

100 Continue
服务器已收到请求头,客户端可以发送请求体。客户端在上传大文件前发送 Expect: 100-continue 来请求这一响应。 RFC 9110
101 Switching Protocols
服务器同意按 Upgrade 头的要求切换此连接上的协议。WebSocket 连接就是这样建立的。 RFC 9110
102 Processing
服务器已接受 WebDAV 请求,仍在处理中,客户端不应因此超时。现行 WebDAV 规范已不再包含它,也很少有服务器发送。 RFC 2518
103 Early Hints
在最终响应之前随 Link 头发送,让浏览器在服务器准备页面的同时开始预加载资源或建立连接。 RFC 8297

2xx 成功

请求已被成功接收、理解并接受。

200 OK
请求成功。响应体包含结果:GET 返回资源,POST 返回操作的结果。 RFC 9110
201 Created
请求创建了新资源。Location 头通常会给出它的 URL。 RFC 9110
202 Accepted
请求已被接受处理,但处理尚未完成,仍可能失败。常见于放入队列的任务。 RFC 9110
203 Non-Authoritative Information
请求成功,但代理修改了源服务器发送的响应。 RFC 9110
204 No Content
请求成功,没有响应体需要发送。常用于 DELETE,以及客户端已掌握新状态时的 PUT 或 PATCH。 RFC 9110
205 Reset Content
请求成功,客户端应重置发出请求的视图,例如清空表单。没有响应体。 RFC 9110
206 Partial Content
响应体只包含 Range 头所请求的字节范围。用于断点续传和视频拖动播放。 RFC 9110
207 Multi-Status
响应体是一个 XML 文档,分别给出多个资源各自的状态。WebDAV 使用此状态码。 RFC 4918
208 Already Reported
在 WebDAV 的 Multi-Status 响应中,标记已经列出过的绑定成员,避免重复列出。 RFC 5842
226 IM Used
响应体是对当前资源应用一项或多项实例操作(例如增量)后的结果。它属于 HTTP 的增量编码,很少有实现。 RFC 3229

3xx 重定向

客户端需要进一步操作才能完成请求,通常是向另一个 URL 发起请求。

300 Multiple Choices
资源有多种表示形式,客户端可以从中选择一种。很少使用,因为没有标准的选择方式。 RFC 9110
301 Moved Permanently
永久重定向:资源有了新的 URL,在 Location 头中给出,搜索引擎通常会改为收录该 URL。客户端跟随重定向时可能把 POST 改为 GET;要保留请求方法,请用 308。 RFC 9110
302 Found
临时重定向:资源目前位于另一个 URL,在 Location 头中给出。客户端跟随重定向时可能把 POST 改为 GET;要保留请求方法,请用 307。 RFC 9110
303 See Other
结果在另一个 URL,客户端应使用 GET 获取。这是表单 POST 之后常用的重定向,这样刷新页面不会再次提交表单。 RFC 9110
304 Not Modified
客户端缓存中的副本仍是最新的,因此不发送响应体。它是对带有 If-None-Match 或 If-Modified-Since 的条件请求的响应。 RFC 9110
305 Use Proxy
必须通过 Location 头中指定的代理访问该资源。出于安全原因已被弃用,客户端不应依赖它。 RFC 9110
306 (Unused)
规范的早期版本使用过这个状态码。现已不再使用,但编号仍然保留。 RFC 9110
307 Temporary Redirect
资源暂时位于另一个 URL,客户端必须用相同的方法和请求体向那里重新发送请求。 RFC 9110
308 Permanent Redirect
资源有了新的永久 URL,客户端必须用相同的方法和请求体向那里重新发送请求。 RFC 9110

4xx 客户端错误

问题出在客户端的请求上:格式有误、缺少权限,或请求了无法提供的内容。

400 Bad Request
请求格式有误,服务器无法处理:语法错误、报文格式无效,或请求体无法解析。 RFC 9110
401 Unauthorized
请求缺少有效的凭据。响应的 WWW-Authenticate 头说明了如何进行身份验证。尽管名称如此,这个状态码关乎身份验证,而不是权限。 RFC 9110
402 Payment Required
保留供将来使用。有些 API 在订阅到期或付费配额用尽时返回它。 RFC 9110
403 Forbidden
服务器理解请求,但拒绝执行。如果请求带有凭据,这些凭据无权访问此资源,再次发送也无济于事。 RFC 9110
404 Not Found
服务器在这个 URL 上没有内容,或者不想透露有内容。这个状态码并不说明资源是否永久不存在。 RFC 9110
405 Method Not Allowed
资源存在,但不支持此请求方法。Allow 头列出了它支持的方法。 RFC 9110
406 Not Acceptable
服务器无法生成满足请求中 Accept、Accept-Language 或 Accept-Encoding 头的响应。 RFC 9110
407 Proxy Authentication Required
与 401 类似,但客户端必须按 Proxy-Authenticate 头的说明向代理进行身份验证。 RFC 9110
408 Request Timeout
服务器等待超时,没有在限定时间内收到完整的请求,因此关闭连接。 RFC 9110
409 Conflict
请求与资源的当前状态冲突,例如基于过时版本的修改,或唯一值重复。 RFC 9110
410 Gone
资源曾经在这里,现已被永久删除。与 404 不同,它告诉客户端和搜索引擎可以不再保留这个 URL。 RFC 9110
411 Length Required
请求没有 Content-Length 头,服务器因此拒绝了请求。 RFC 9110
412 Precondition Failed
If-Match、If-Unmodified-Since 或类似请求头中的条件不成立,因此请求未被执行。它可以防止覆盖别人所做的修改。 RFC 9110
413 Content Too Large
请求体超过了服务器接受的大小,通常是服务器或其前面代理的上传限制所致。它以前的名称是 Payload Too Large。 RFC 9110
414 URI Too Long
URL 超过了服务器接受的长度。这通常意味着本应放在 POST 请求体中的数据被放进了查询字符串。 RFC 9110
415 Unsupported Media Type
服务器不接受请求体的格式,即 Content-Type 或 Content-Encoding 头所声明的格式。 RFC 9110
416 Range Not Satisfiable
Range 头请求的字节超出了资源的范围。 RFC 9110
417 Expectation Failed
服务器无法满足请求中 Expect 头提出的要求。 RFC 9110
418 I'm a teapot
源自超文本咖啡壶控制协议(Hyper Text Coffee Pot Control Protocol)的愚人节玩笑:茶壶拒绝煮咖啡。RFC 9110 把这个编号列为未使用并予以保留,因为它作为玩笑被部署得太多,已无法再赋予其他含义。 RFC 2324, RFC 9110
421 Misdirected Request
请求到达了一台未配置为响应此主机名的服务器。浏览器把 HTTP/2 连接复用于其他主机时可能出现这种情况;客户端可以在新连接上重试。 RFC 9110
422 Unprocessable Content
请求的语法正确,但内容无效,例如未通过校验的 JSON 请求体。它源自 WebDAV,当时的名称是 Unprocessable Entity。 RFC 9110, RFC 4918
423 Locked
该 WebDAV 资源已被锁定,无法对其应用此方法。 RFC 4918
424 Failed Dependency
未对此 WebDAV 资源执行该方法,因为它所依赖的另一个操作失败了。 RFC 4918
425 Too Early
服务器不会处理通过 TLS 早期数据(early data)到达的请求,因为它可能是重放的请求。客户端应在握手完成后重新发送。 RFC 8470
426 Upgrade Required
服务器拒绝通过当前协议处理请求,并在 Upgrade 头中指明客户端必须切换到的协议。 RFC 9110
428 Precondition Required
服务器要求请求必须是条件请求,例如带上 If-Match,以免更新在不知不觉中覆盖较新的版本。 RFC 6585
429 Too Many Requests
客户端在给定时间内发送的请求过多,这称为限流(rate limiting)。Retry-After 头可能会说明需要等待多久。 RFC 6585
431 Request Header Fields Too Large
请求头总体或其中某一个超过了服务器接受的大小。常见原因是 Cookie 过大。 RFC 6585
451 Unavailable For Legal Reasons
服务器因法律要求(例如法院命令)而拒绝访问。这个编号取自小说《华氏 451》。 RFC 7725

5xx 服务器错误

请求本身可能有效,但服务器或其前面的网关未能完成它。

500 Internal Server Error
服务器遇到了意料之外的情况,往往是未处理的异常。原因要到服务器日志中查找。 RFC 9110
501 Not Implemented
服务器不支持请求所需的功能,例如它无法识别的请求方法。 RFC 9110
502 Bad Gateway
网关或代理从其后端服务器收到了无效的响应。往往是代理后面的应用崩溃了,或者没有在监听。 RFC 9110
503 Service Unavailable
服务器由于过载或维护,暂时无法处理请求。Retry-After 头可能会说明何时重试。 RFC 9110
504 Gateway Timeout
网关或代理等待其后端服务器的响应超时。往往是应用太慢或无法访问。 RFC 9110
505 HTTP Version Not Supported
服务器不支持请求所用的 HTTP 主版本。 RFC 9110
506 Variant Also Negotiates
服务器配置有误:透明内容协商选中的变体本身也被配置为进行协商,从而形成循环。 RFC 2295
507 Insufficient Storage
服务器无法存储完成请求所需的内容。它是为 WebDAV 定义的。 RFC 4918
508 Loop Detected
服务器在遍历绑定时发现了无限循环,因此终止了 WebDAV 操作。 RFC 5842
510 Not Extended
请求缺少服务器要求的扩展。定义此状态码的规范现已被列为历史文档(Historic),IANA 注册表将该状态码标记为已废弃。 RFC 2774
511 Network Authentication Required
客户端必须通过身份验证才能访问网络。发送它的是强制门户(captive portal),例如酒店 Wi-Fi 的登录页,而不是所请求的网站。 RFC 6585

非标准状态码

这些状态码不在 IANA 注册表中。每个都属于特定的服务器或服务,其含义只在那里成立。

419 Page Expired 非标准
表单的 CSRF 令牌缺失或已过期时,Laravel 会返回它。 Laravel
444 No Response 非标准
nginx 配置可以返回 444,不发送任何响应就关闭连接。它会出现在 nginx 日志中,而客户端什么也收不到。 nginx
494 Request Header Too Large 非标准
请求头超出 nginx 的缓冲区时,nginx 在内部使用它。客户端收到的是 400 响应。 nginx
495 SSL Certificate Error 非标准
客户端证书验证失败时,nginx 在内部使用它。除非配置中另作处理,否则客户端收到的是 400 响应。 nginx
496 SSL Certificate Required 非标准
客户端没有提供服务器要求的证书时,nginx 在内部使用它。 nginx
497 HTTP Request Sent to HTTPS Port 非标准
普通 HTTP 请求到达要求 HTTPS 的端口时,nginx 在内部使用它。 nginx
499 Client Closed Request 非标准
客户端在服务器响应之前关闭了连接时,nginx 会记录它。这通常意味着客户端的超时时间短于应用的处理时间。 nginx
509 Bandwidth Limit Exceeded 非标准
网站用完带宽配额时,cPanel 等主机控制面板会返回它。 cPanel
520 Web Server Returned an Unknown Error 非标准
源服务器返回空的、未知的或意外的响应时,Cloudflare 会返回它。 Cloudflare
521 Web Server Is Down 非标准
源服务器拒绝了 Cloudflare 的连接时,Cloudflare 会返回它。 Cloudflare
522 Connection Timed Out 非标准
Cloudflare 与源服务器建立 TCP 连接超时时,会返回它。 Cloudflare
523 Origin Is Unreachable 非标准
Cloudflare 无法连接到源服务器时会返回它,原因可能是 DNS 记录有误或路由问题。 Cloudflare
524 A Timeout Occurred 非标准
Cloudflare 已连接到源服务器,但源服务器没有及时发送 HTTP 响应。 Cloudflare
525 SSL Handshake Failed 非标准
Cloudflare 与源服务器之间的 TLS 握手失败时,Cloudflare 会返回它。 Cloudflare
526 Invalid SSL Certificate 非标准
Cloudflare 无法验证源服务器的 TLS 证书时,会返回它。 Cloudflare

在浏览器中运行。粘贴的内容不会被上传。

关于此工具

状态码是如何分类的

每个 HTTP 响应都以一个三位数的状态码开头。第一位数字表示类别:1xx 是临时响应,2xx 表示成功,3xx 要求客户端转到别处,4xx 表示请求有问题,5xx 表示服务器有问题。客户端遇到不认识的状态码时,必须按该类别的第一个状态码处理,因此未知的 4xx 会被当作 400。

数字后面的文字,例如 Not Found,叫作原因短语(reason phrase)。它只是给人看的描述:规范要求客户端忽略它,HTTP/2 和 HTTP/3 则根本不发送它。本列表中标准状态码的名称都取自 IANA 注册表,只有 418 例外,注册表将其列为 (Unused)。

容易混淆的状态码

401 与 403。401 表示服务器不知道你是谁,进行身份验证可能有用。403 表示服务器拒绝请求,重新验证身份也不会改变结果。

301、302、307 与 308。301 和 308 是永久的,302 和 307 是临时的。对于 301 和 302,客户端跟随重定向时可能把 POST 改为 GET;307 和 308 则要求保持相同的方法和请求体。

502 与 504。两者都来自应用前面的代理或负载均衡器。502 表示代理收到了无效内容或连接失败;504 表示代理一直在等,却没有及时收到任何响应。

404 与 410。404 表示这里没有内容,可能只是暂时的。410 表示资源已被永久删除。

本列表的来源

标准状态码来自 IANA 的 HTTP 状态码注册表(HTTP Status Code Registry)。大多数在 RFC 9110《HTTP Semantics》中定义,它在 2022 年取代了 RFC 7231。其余来自 WebDAV 和一些较小的扩展,每个条目都注明了对应的 RFC。仍处于互联网草案(Internet-Draft)阶段的临时注册未收录。最后一组是未经注册、但会出现在 nginx、Cloudflare 等产品的日志和错误页中的状态码。

完整列表就在页面中,因此无需 JavaScript 也能阅读。搜索框在你的浏览器中进行筛选。

常见问题

401 和 403 有什么区别?

401 Unauthorized 表示请求没有有效的凭据,客户端可以在完成身份验证后重试。403 Forbidden 表示服务器理解请求,但拒绝执行:已发送的凭据都无权访问,再次发送也无济于事。

永久重定向应该用 301 还是 308?

两者都告诉客户端和搜索引擎该 URL 已永久迁移。对于 301,客户端跟随重定向时可以把 POST 改为 GET,而 308 要求保持相同的方法和请求体。对于用 GET 请求的普通页面 URL,两者的表现相同。

502 和 504 有什么区别?

两者都由代理、网关或负载均衡器发送,而不是由应用发送。502 Bad Gateway 表示其后端服务器返回了无效响应或拒绝了连接。504 Gateway Timeout 表示后端服务器没有在代理的时限内响应。

499 是真正的 HTTP 状态码吗?

它没有在 IANA 注册。客户端在响应发送之前关闭连接时,nginx 会在访问日志中写入 499,因此没有任何客户端会收到它。其他产品也以类似方式使用注册表之外的编号,例如 Cloudflare 的 520 到 526。

网络分类的其他工具