HTTP 状态码全面指南
别再猜 401 和 403:按家族梳理每种状态,配合实例、反模式,以及 SEO 真正关心的那些码。

为什么重要
后端返回 200 OK,却在正文里写 {"error": "Unauthorized"}。前端的通用错误处理只看 状态码 是成功,登录表单陷入死循环。这类细微差错会白白消耗工程时间,更会扭曲 SEO 抓取与死链统计。何时该返回哪个状态码是基本功。
三个真实场景
缺令牌?401。令牌无效权限?403。资源不存在?404。
客户端行为可预期
301 传递 PageRank;302 表示临时,不传权重。要有意识选择。
永久跳转,权重迁移
503 配合 Retry-After 头,提示爬虫稍后再来,而非直接下线。
搜索引擎知道稍后重试
五大类一览
| 区间 | 类别 | 常见成员 |
|---|---|---|
| 1xx | 信息性 | 100 Continue,101 Switching Protocols |
| 2xx | 成功 | 200 OK,201 Created,204 No Content |
| 3xx | 重定向 | 301,302,304 Not Modified,308 |
| 4xx | 客户端错误 | 400,401,403,404,422,429 |
| 5xx | 服务端错误 | 500,502,503,504 |
操作指南 —— 使用状态码参考
打开 HTTP 状态参考。
按编号或描述搜索
输入「401」「unauthorized」或「rate limit」,匹配项会排到前列。
阅读规范含义
每条说明不只复述 curl 输出,而是对齐规范表述。
了解实际用法
注释会点名 GitHub、Stripe、AWS 等常见 API 的细微差异。
关注 SEO 影响
每条标记搜索引擎处理方式(是否索引、是否传递排名等)。
复制一句话描述
可直接贴进 API 文档或代码注释。
场景
POST /admin/users
(No Authorization header)推荐响应
401 Unauthorized
WWW-Authenticate: Bearer realm="admin"场景
POST /admin/users
Authorization: Bearer eyJ... (valid token, viewer scope)推荐响应
403 Forbidden
{"error": "scope_admin_required"}
进阶技巧
- 语义上无效但格式正确的输入用 422(例如 JSON 字段类型不对)。格式损坏才用 400。
- 删除资源返回 204 No Content 比 200 空正文更清晰——表明刻意无负载。
- 429 / 503 务必带
Retry-After,让智能客户端知道何时重试。 - 避免 200 +
error: ...。这会毁掉 HTTP 语义,也会让各类监控误判。
常见误区
常见误区
用 404 表示「无权访问」
模糊的 404 可以隐藏资源存在(例如私有仓库),但对常规需登录的 API,更宜用 403,让客户端明确是权限问题。
常见误区
把 302 永久缓存
302 规范上是 临时,但部分中间层会激进缓存。若为永久跳转请发 301(或需保留方法的 308)。
常见误区
客户端错误却返回 500
500 表示 服务端 故障。若请求数据有问题应返回 4xx,否则告警会把对方的 Bug 当成你的事故。
何时不适合用本参考
- 全新协议设计——HTTP 状态与 HTTP 语义绑定;gRPC、WebSocket 等有各自的约定。
- 应用内错误上报——业务错误码应出现在正文,与 HTTP 码并存。
- 监控仪表盘——APM 应自动归类状态码;本参考服务于上线前的设计决策。
常见问题
301 和 308 有何区别?
二者均为永久重定向。308 保证 HTTP 方法不变;301 历史上允许客户端把 POST 跟进成 GET。
418「我是茶壶」是真的吗?
是的,RFC 2324(1998 年愚人节)及 RFC 7168。属于玩笑响应,生产 API 不使用。
是否该暴露框架专有码(如 419、440)?
尽量避免非标准码。优先使用 IANA 注册集合,通用客户端才能理解。