网络

HTTP 状态码列表

面向开发者的 HTTP 状态码(1xx-5xx)完整列表,包含含义、常见原因和解决方法。内置查询工具——输入代码即可立即查看详情。

HTTP 状态码对照表
代码 名称 含义 常见原因
1xx — 信息性响应
100 Continue (Continue) 表示服务器已收到请求的初始部分,客户端应继续发送其余内容。 当客户端在发送较大的请求体之前发送 Expect: 100-continue 请求头时返回。
101 Switching Protocols (Switching Protocols) 表示服务器接受 Upgrade 请求头的要求,正在切换到另一种协议。 建立 WebSocket 连接时常见的正常响应。
102 Processing (Processing) 表示服务器已接受请求但仍在处理中,尚无响应可返回(WebDAV)。 用于在长时间运行的 WebDAV 操作中避免超时。
103 Early Hints (Early Hints) 在最终响应之前发送 Link 等预备响应头,让浏览器可以预加载资源。 由 CDN 或反向代理添加,用于加速 CSS/JS 的预加载。
2xx — 成功
200 OK (OK) 最常见的成功响应,表示请求已被成功处理。
201 Created (Created) 表示请求导致新资源被创建。 由通过 POST 创建资源的 API 返回,通常包含指向新资源的 Location 响应头。
202 Accepted (Accepted) 表示请求已被接受,但处理尚未完成(异步处理)。 用于仅将任务加入队列的异步 API,或批处理接收端点。
204 No Content (No Content) 表示请求成功,但没有内容可返回。 常见于 DELETE 成功后,或 API 设计中省略响应体的 PUT 更新。
206 Partial Content (Partial Content) 表示根据客户端的 Range 请求头,只返回了资源的一部分。 视频拖动播放或断点续传下载时的正常响应。
3xx — 重定向
301 Moved Permanently (Moved Permanently) 表示资源已永久移动到新的 URL;搜索引擎会将排名信号转移到新 URL。 用于 URL 结构变更或域名迁移后重定向旧 URL。
302 Found (Found) 表示资源暂时位于另一个 URL。永久性移动应改用 301。 常用于维护期间的临时路由,或登录后的重定向。
303 See Other (See Other) 表示应使用 GET 方法从另一个 URL 获取结果(Post-Redirect-Get 模式)。 用于表单提交(POST)之后,以避免浏览器的重复提交提示。
304 Not Modified (Not Modified) 表示缓存的资源未发生变化,因此不会重新发送响应体。 在缓存仍然有效时,针对使用 If-None-Match / If-Modified-Since 的条件请求返回。
307 Temporary Redirect (Temporary Redirect) 一种临时重定向,与 302 不同,重新发送时会保留原始的方法和请求体。 用于需要重定向 POST/PUT 请求同时保留请求体的 API 设计。
308 Permanent Redirect (Permanent Redirect) 一种永久重定向,与 301 不同,重新发送时会保留原始的方法和请求体。 用于需要永久迁移同时保留请求方法的 API 版本迁移。
4xx — 客户端错误
400 Bad Request (Bad Request) 表示请求的语法或参数格式有误,服务器无法理解。 通常由 JSON 语法错误、缺少必需参数或类型不匹配引起。
401 Unauthorized (Unauthorized) 表示缺少或提供了无效的身份验证凭据(尽管名称如此,实际含义是「未认证」)。 常见原因包括令牌过期、缺少 Authorization 请求头或 API 密钥错误。
402 Payment Required (Payment Required) 保留供未来使用,有时用于表示需要付款。 一些 API 会借用此状态码来表示超出使用限额或计费方案已过期。
403 Forbidden (Forbidden) 表示服务器理解请求,但拒绝授权执行该请求。 常见原因包括权限不足、IP 限制、违反 CORS 策略或文件权限配置错误。
404 Not Found (Not Found) 表示未能找到请求的资源。 通常由未注册的路由、URL 拼写错误或访问已被删除的资源引起。
405 Method Not Allowed (Method Not Allowed) 表示资源存在,但不允许使用指定的 HTTP 方法访问它。 常见于向仅支持 GET 的端点发送 POST 请求,或类似的方法不匹配情况。
406 Not Acceptable (Not Acceptable) 表示服务器无法生成符合客户端 Accept 请求头要求的响应。 例如客户端请求 Accept: application/xml,而 API 只能返回 JSON 时发生。
408 Request Timeout (Request Timeout) 表示服务器等待客户端完成请求时超时。 常由网络连接缓慢、上传文件较大或客户端在请求中途卡住引起。
409 Conflict (Conflict) 表示请求与资源的当前状态存在冲突。 常见于并发编辑时的乐观锁冲突,或尝试创建重复资源。
410 Gone (Gone) 表示资源已被永久移除且不会再恢复(比 404 更强烈的信号)。 用于明确告知搜索引擎内容已被有意删除并下线。
413 Payload Too Large (Payload Too Large) 表示请求体的大小超过了服务器愿意接受的限制。 通常由超出文件上传大小限制,或 Nginx/PHP 中请求体大小设置不足引起。
414 URI Too Long (URI Too Long) 表示请求的 URI 长度超过了服务器愿意处理的限制。 常见于将大量数据塞入 GET 查询参数中的情况。
415 Unsupported Media Type (Unsupported Media Type) 表示服务器不支持请求体所使用的媒体类型。 常见于向 JSON API 发送 Content-Type: text/plain,或类似的请求头配置错误。
422 Unprocessable Entity (Unprocessable Entity) 表示请求语法正确,但语义验证失败。 常用于报告表单验证错误,例如缺少必填字段或格式不正确。
425 Too Early (Too Early) 表示服务器拒绝处理可能因早期数据风险而被重放的请求。 可作为针对使用 TLS 1.3 0-RTT 数据的重放攻击的防御手段而返回。
429 Too Many Requests (Too Many Requests) 表示客户端在给定时间窗口内发送了过多请求(速率限制)。 由超出 API 速率限制引起;Retry-After 响应头通常会指示重试前需等待的时间。
451 Unavailable For Legal Reasons (Unavailable For Legal Reasons) 表示内容因法律要求(如法院命令)而无法提供。 当内容提供方因版权申诉或特定国家/地区的法律法规而屏蔽访问时返回。
5xx — 服务器错误
500 Internal Server Error (Internal Server Error) 表示服务器发生了意外错误,无法处理该请求。 原因多种多样:应用程序中未处理的异常、配置错误、数据库连接失败等等。
501 Not Implemented (Not Implemented) 表示服务器不支持完成该请求所需的功能。 常见于向较旧的服务器实现发送尚未实现的 HTTP 方法(如 PATCH)时发生。
502 Bad Gateway (Bad Gateway) 表示代理或网关从上游服务器收到了无效的响应。 通常由上游应用服务器宕机或崩溃引起。
503 Service Unavailable (Service Unavailable) 表示服务器暂时过载或正在维护,无法处理请求。 主要由高负载下的资源耗尽,或计划中的维护窗口引起。
504 Gateway Timeout (Gateway Timeout) 表示代理或网关未能及时收到上游服务器的响应。 常由后端处理耗时过长、网络延迟或上游服务器挂起引起。
505 HTTP Version Not Supported (HTTP Version Not Supported) 表示服务器不支持请求中使用的 HTTP 版本。 常见于旧客户端或配置错误的代理使用了非预期的 HTTP 版本进行通信时发生。
507 Insufficient Storage (Insufficient Storage) 表示服务器没有足够的存储空间来完成请求(WebDAV)。 当文件存储操作因磁盘空间不足而失败时返回。
508 Loop Detected (Loop Detected) 表示服务器在处理请求时检测到了无限循环(WebDAV)。 常见于 WebDAV 绑定配置中存在循环引用的情况。
511 Network Authentication Required (Network Authentication Required) 表示客户端需要进行身份验证才能获得网络访问权限。 用于重定向到强制门户登录页面,例如公共 Wi-Fi 场景。

使用提示

  • 404 和 410 看起来相似,但 410 明确表示内容是被有意删除且不会再恢复的。对于没有替代内容的页面,使用 410 可以向搜索引擎发出更清晰的信号。
  • 301 与 308、302 与 307 分别共享「永久 vs 临时」的区别,但 308 和 307 在重新发送时会保留原始的 POST 请求体,这一点与 301 和 302 不同。
  • 收到 429 Too Many Requests 时,请检查 Retry-After 响应头,并等待相应时间后再重试——强行持续请求可能导致完全被封禁。
  • 5xx 错误表示服务器端出现了问题,而不是你的请求本身有误——在排查客户端代码之前,应先检查服务器日志和运行状态。
  • 浏览器开发者工具的「网络」(Network)面板会为每个请求的状态码标注颜色。结合本表使用可以大幅提升调试效率。

常见问题

两者都表示未找到资源,但 404 是一般性的「未找到」,可能只是暂时性的;而 410 则明确表示该资源已被永久移除,且不会再恢复。对于有意删除的内容,使用 410 可以为 SEO 提供更清晰的信号。

301(永久)重定向会将旧 URL 几乎所有的排名信号转移到新 URL。302(临时)重定向则告诉搜索引擎继续将旧 URL 视为规范地址,因此永久性的迁移应始终使用 301。

401 Unauthorized 实际上的含义是「未通过身份验证」——客户端尚未证明自己的身份。403 Forbidden 则表示客户端已通过身份验证,但没有相应的权限。尽管名称容易引起误解,401 关乎「认证」,而 403 关乎「授权」。

502 表示反向代理或负载均衡器从后端应用服务器收到了无效的响应。首先应检查应用服务器进程是否正在运行、有没有崩溃。

可以使用浏览器开发者工具的「网络」(Network)面板、curl 的 -i 参数,或将代码输入本页面的查询工具来查看其含义。
ツールくん

闲话 ― HTTP 状态码简史

HTTP 状态码体系最早在 1996 年发布的 HTTP/1.0 规范 RFC 1945 中被标准化。1999 年发布的 HTTP/1.1(RFC 2616)确立了我们今天所使用的大部分代码体系,包括 4xx 和 5xx 系列,此后又经过 RFC 7231(2014 年)和 RFC 9110(2022 年)的延续和更新。

著名的玩笑状态码 418 I'm a teapot 出自 1998 年愚人节的一份 RFC 文档,其中描述了一个虚构的「超文本咖啡壶控制协议」(HTCPCP)。该状态码原本设定为:如果你要求一个茶壶去煮咖啡,它就会返回这个代码。

「首位数字表示大类」这一设计理念,被认为影响了后来 SMTP、FTP 等协议中的返回码体系。「1xx = 信息性响应、2xx = 成功」这种简洁的分类方式,近三十年来基本没有改变。

451 Unavailable For Legal Reasons 是相对较新的状态码,于 2015 年在 RFC 7725 中被正式标准化。数字 451 是刻意选定的,用以致敬雷·布拉德伯里(Ray Bradbury)以审查制度为主题的反乌托邦小说《华氏 451 度》(Fahrenheit 451)。