HTTP 状态码速查
搜索全部 HTTP 状态码 —— 从 100 Continue 到 511 Network Authentication Required —— 附简明解释。
1xx 信息
100继续
服务器已收到请求头,客户端可以继续发送请求体。
101切换协议
服务器同意切换到客户端请求的协议(如升级到 WebSocket)。
102处理中
服务器已收到并正在处理请求,目前还没有响应(WebDAV)。
103提前提示
用于在最终响应前提前返回部分头部,常用于预加载提示。
2xx 成功
200成功
请求成功,最常见的成功状态。
201已创建
请求成功并创建了新资源,常用于 POST。
202已接受
请求已被接受,但处理尚未完成。
204无内容
请求成功但响应体为空。
205重置内容
请求成功,并要求客户端重置文档视图。
206部分内容
服务器按 Range 头返回部分内容(断点续传等)。
3xx 重定向
301永久重定向
永久重定向。客户端历史上可能把 POST 转成 GET。
302临时重定向
临时重定向。历史上最常用的重定向。
303见其它
应使用 GET 在另一个 URI 上查询响应。
304未修改
资源自上次请求以来未变化,缓存仍然有效。
307临时重定向
本次请求应重定向到新 URI,但今后请求仍用原 URI。方法保持不变。
308永久重定向
永久重定向,要求保持原 HTTP 方法(与 301 区别)。
4xx 客户端错误
400请求错误
请求格式错误,服务器无法处理。
401未认证
需要认证但凭据缺失或错误。注意它表达的是 "未认证" 而不是 "无权限"。
403禁止访问
请求合法但服务器拒绝处理 —— 已认证但无权限。
404未找到
找不到请求的资源。
405方法不允许
请求方法不被该资源支持。
406不可接受
无法返回 Accept 头要求的内容类型。
408请求超时
等待客户端请求超时。
409冲突
由于资源当前状态与请求冲突而无法处理。
410已永久删除
资源已永久删除且不会再回来。
411需要 Content-Length
请求未携带必需的 Content-Length 头。
412前置条件失败
请求头中的前置条件不满足。
413负载过大
请求体过大,超过服务器允许的上限。
414URI 过长
请求 URI 过长。
415不支持的媒体类型
服务器不支持请求体的媒体类型。
418我是茶壶
RFC 2324 愚人节玩笑 —— 茶壶不能煮咖啡。不要在真实 API 中使用。
422无法处理的实体
请求体语法正确但语义校验失败。常见于 JSON API 的字段校验。
423已锁定
目标资源被锁定(WebDAV)。
425过早
服务器不愿意处理可能被重放的请求。
426需要升级
需要客户端升级到其它协议(例如 TLS/1.3)。
428需要前置条件
服务器要求请求必须是条件请求。
429请求过多
客户端在单位时间内请求过多(限流)。
431请求头过大
请求头单项或合计过大。
451因法律原因不可用
因法律原因(如版权请求、法院禁令)拒绝访问。
5xx 服务端错误
500服务器内部错误
服务器内部错误,没有更具体的状态码可用。
501未实现
服务器不支持该请求方法或无法实现该功能。
502网关错误
作为网关或代理时,从上游收到了非法响应。
503服务不可用
服务暂时不可用(过载或维护)。常配合 Retry-After 头使用。
504网关超时
作为网关或代理时未能及时从上游收到响应。
505HTTP 版本不支持
服务器不支持请求所用的 HTTP 协议版本。
507存储不足
服务器存储空间不足(WebDAV)。
508检测到循环
处理请求时检测到无限循环(WebDAV)。
511需要网络认证
需要先通过网络认证才能访问(常见于公共 Wi-Fi 强制登录页)。
521源服务器宕机(Cloudflare)
Cloudflare 专属:源服务器拒绝了连接。
522连接超时(Cloudflare)
Cloudflare 专属:连接源服务器超时。
525SSL 握手失败(Cloudflare)
Cloudflare 专属:与源服务器的 SSL 握手失败。
HTTP 状态码结构
HTTP 状态码是服务器对每个请求都会返回的三位数字。首位代表响应类别:1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误(请求有问题或未授权)、5xx 服务端错误(请求合法但服务器没能处理)。后两位标识具体情况。
状态码由 RFC 9110(当前 HTTP 语义规范,替代 RFC 7231)以及若干补充 RFC 定义。表现良好的服务器应当返回最具体的码 —— 比如请求体语法合法但语义错误时,422 Unprocessable Entity 比泛泛的 400 更有用。
通过搜索框可以按数字、名字或类别过滤。本表收录所有标准状态码,并补充了几个常见的非标准码:418 I'm a teapot、451 Unavailable For Legal Reasons、Cloudflare 的 5xx 序列等。
使用场景
- 在设计校验类 API 之前先查清 422 的含义。
- 写认证中间件时区分 401 Unauthorized 与 403 Forbidden。
- 确认 CDN 实际返回的状态码与文档一致。
- 向新人解释 301 与 308 重定向的差别。
- 向非技术干系人解释 Cloudflare 的 525 是什么意思。
最佳实践
- 凭据缺失或错误返回 401;已认证但无权限返回 403 —— 二者不可互换。
- 重定向非 GET 方法时优先 308 而不是 301,以保留请求方法。
- 计划维护用 503 + Retry-After 头。
- 永远不要用 200 + 错误体 —— 客户端会按成功处理而忽略错误内容。
- Cache-Control 要与状态码匹配:4xx / 5xx 通常应 no-store。
常见问题
401 与 403 有什么区别?
401 是 "你没认证" —— 凭据缺失或错误。403 是 "你认证了但没权限" —— 服务器知道你是谁,仍拒绝你访问。
什么时候用 422 而不是 400?
422 Unprocessable Entity 表示请求体能解析但语义校验失败。400 Bad Request 表示请求结构本身就错了,服务器根本没法解析。
418 是真的状态码吗?
是 RFC 2324(愚人节玩笑:超文本咖啡壶控制协议)保留的码。主流框架作为彩蛋实现,但不应在真实 API 中使用。
308 比 301 多了什么?
308 Permanent Redirect 要求客户端用相同方法重发请求。301 历史上允许客户端把 POST 转为 GET,可能破坏非幂等操作。