HTTP状态码详解
概念引入
想象你去飞翔公司办事:
- 前台微笑着说"请上 18 楼"——这是成功(2xx)
- 前台说"人事部已搬到 20 楼,请去那边"——这是重定向(3xx)
- 保安拦住你"没有工牌不能进"——这是客户端错误(4xx)
- 电梯坏了"请稍后再来"——这是服务器错误(5xx)
HTTP 状态码(Status Code) 就是服务器给客户端的"办事结果通知单",用三位数字精确告知请求的处理结果。读懂状态码,就像读懂前台的暗示——能快速定位问题所在。
核心内容
状态码五大分类
| 分类 | 范围 | 含义 | 飞翔公司场景 |
|---|---|---|---|
| 1xx 信息 | 100~199 | 请求已收到,继续处理 | 服务器说"收到,请继续发送剩余数据" |
| 2xx 成功 | 200~299 | 请求已成功处理 | 航仔查到工资条,页面正常显示 |
| 3xx 重定向 | 300~399 | 需要进一步操作(通常自动跳转) | 官网旧地址自动跳转到新域名 |
| 4xx 客户端错误 | 400~499 | 请求有问题,客户端需修正 | 波比填错表单,鸣哥访问不存在的页面 |
| 5xx 服务器错误 | 500~599 | 服务器内部出错 | 凌叔的服务器宕机,翼王的架构扛不住流量 |
常见状态码详解
2xx 成功类
| 状态码 | 含义 | 说明 | 飞翔公司场景 |
|---|---|---|---|
| 200 OK | 请求成功 | 最常见,一切正常 | 空少打开官网首页,页面完美加载 |
| 201 Created | 已创建 | 资源创建成功 | 波比提交活动申请,系统生成新记录 |
| 204 No Content | 无内容 | 成功但无返回体 | 云吞删除一条社群公告,无需返回数据 |
3xx 重定向类
| 状态码 | 含义 | 说明 | 飞翔公司场景 |
|---|---|---|---|
| 301 Moved Permanently | 永久重定向 | 资源已永久搬家,SEO 权重转移 | 官网从 old.feixiang.net 永久迁移到 www.feixiang.net |
| 302 Found | 临时重定向 | 资源临时在别处,SEO 权重不转移 | 活动期间临时跳转到活动页面,活动结束后恢复 |
| 304 Not Modified | 未修改 | 缓存有效,用本地副本 | 空少刷新页面,CSS 文件没变化,浏览器直接用缓存 |
301 vs 302 关键区别:301 是"房子卖了,永远住新地址",搜索引擎会更新索引;302 是"出差住酒店,过几天还回来",搜索引擎保留原地址。
4xx 客户端错误类
| 状态码 | 含义 | 说明 | 飞翔公司场景 |
|---|---|---|---|
| 400 Bad Request | 请求语法错误 | 服务器看不懂你在说什么 | 波比提交的 JSON 少了一个逗号,服务器解析失败 |
| 401 Unauthorized | 未认证 | 需要登录,但没提供凭证 | 雁姐没登录就想看用户数据,被系统拦住 |
| 403 Forbidden | 禁止访问 | 已登录,但权限不足 | 星宇(产品助理)想访问翼王的架构设计文档,权限不够 |
| 404 Not Found | 资源不存在 | URL 写错或资源已删除 | 鸣哥访问了一篇已删除的旧文章 |
401 vs 403 关键区别:401 是"没出示证件"(未认证),403 是"出示了证件但不让进"(已认证但无权限)。就像公司大门:401 = 忘带工牌;403 = 你是访客但想进机房。
5xx 服务器错误类
| 状态码 | 含义 | 说明 | 飞翔公司场景 |
|---|---|---|---|
| 500 Internal Server Error | 内部服务器错误 | 服务器自己出 bug 了 | 航仔的代码抛了空指针异常 |
| 502 Bad Gateway | 网关错误 | 上游服务器无响应 | 凌叔重启了后端服务,Nginx 暂时连不上 |
| 503 Service Unavailable | 服务不可用 | 服务器过载或维护中 | 年中大促流量暴增,服务器扛不住了 |
服务器决策流程图
当飞翔公司的服务器收到一个请求时,内部判断逻辑如下:
飞翔公司场景化错误示例
304 Not Modified 与缓存
304 是缓存机制的关键角色。当浏览器再次请求一个资源时,会带上上次收到的 Last-Modified 或 ETag 信息。服务器发现资源没变化,就返回 304,告诉浏览器"用你本地的缓存就行"。
| 首次请求 | 再次请求(带缓存标记) | 服务器响应 |
|---|---|---|
GET /style.css | GET /style.cssIf-Modified-Since: Mon, 01 Jun 2026 | 304 Not Modified(无实体主体) |
飞翔公司场景:空少刷新飞翔官网,logo.png 和 main.css 都返回 304,页面秒开,省流量又省服务器带宽。凌叔在 Nginx 里配好缓存策略,服务器压力小了一半。
本篇小结
- HTTP 状态码分五大类:1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务器错误
- 200 是成功标配;201 表示创建成功;204 表示成功但无返回体
- 301 永久重定向(SEO 权重转移),302 临时重定向(保留原地址)
- 401 是"未认证"(没登录),403 是"无权限"(已登录但不让进)
- 404 资源不存在;400 请求格式错误
- 500 服务器内部错误;502 网关上游异常;503 服务过载或维护
- 304 表示缓存有效,浏览器可直接使用本地副本
动手实践
温馨提示: 以下实践示例中涉及的域名(如
www.feixiang.net)、公司场景和接口均为虚构数据,仅用于演示协议原理,实际执行时可能不会产生文档中描述的效果。建议将命令中的域名替换为你自己可访问的真实地址进行练习。
实践:用 curl 观察不同状态码
# 200 OK
curl -I http://www.feixiang.net
# 301/302 重定向(-L 跟随跳转,-I 只看头)
curl -IL http://feixiang.net
# 404 Not Found(访问不存在的页面)
curl -I http://www.feixiang.net/this-page-does-not-exist
# 观察 304 缓存(需要配合缓存头,首次请求)
curl -I http://www.feixiang.net/static/logo.png
实践:用浏览器开发者工具观察状态码
- 打开 Chrome,按
F12进入 Network 面板 - 访问
www.feixiang.net - 刷新页面,观察第二次请求中
style.css、logo.png等文件的状态码是否变成304 - 点击某个请求,查看 Response Headers 中的
Status Code和Cache-Control
实践:思考题
- 如果飞翔公司把官网从
http://feixiang.net永久迁移到https://www.feixiang.net,应该返回 301 还是 302?为什么? - 波比访问内部系统时遇到 403,他应该怎么排查?(提示:对比 401 和 403 的区别)
- 凌叔发现服务器频繁返回 502,可能是什么原因?他应该检查哪些环节?
- 设计一个场景:星宇在飞翔 OA 系统中依次遇到 401 → 登录后遇到 403 → 找翼王开通权限后最终看到 200。用一段话描述这个完整过程。