域名解析原理与网络接入
12.5 HTTP状态码常识
Tip
每次你请求服务器,服务器都会回你一个数字。这个数字就是Status Code (状态码)。理解这些数字,你就读懂了服务器的情绪。
1. 为什么要学这个?
前端报错 500,你甩锅给后端:“你服务挂了。”
后端报错 400,甩锅给前端:“你参数传错了。”
不懂状态码,你连锅都甩不出去。这是开发团队沟通的通用语言。
2. 核心概念:五大门派
- 1xx: Hold on (等一下)。服务器收到请求了,正在处理。
- 2xx: Success (成功)。
200 OK: 一切正常。
- 3xx: Go Away (重定向)。
301: 永久搬家 (SEO 权重转移)。304: Not Modified (缓存没变,直接用本地的)。
- 4xx: You fked up** (你错了 - 客户端错误)。
400 Bad Request: 参数错了。401 Unauthorized: 没登录 / Token 过期。403 Forbidden: 登录了,但没权限。404 Not Found: 找不到。
- 5xx: I fked up** (我错了 - 服务器错误)。
500 Internal Server Error: 代码抛异常了。502 Bad Gateway: 网关连不上后端。504 Gateway Timeout: 后端太慢超时了。
3. 解决方案 (HOW)
3.1 客户端错误 (4xx - 你的锅)
graph TD
User["用户请求"] --> Check{"检查参数/权限"}
Check --"参数错"--> 400["400: Bad Request"]
Check --"没登录"--> 401["401: Unauthorized"]
Check --"没权限"--> 403["403: Forbidden"]
Check --"找不到"--> 404["404: Not Found"]
style 400 fill:#ffcc80,stroke:#ef6c00
style 401 fill:#ffcc80,stroke:#ef6c00
style 403 fill:#ffcc80,stroke:#ef6c00
style 404 fill:#ffcc80,stroke:#ef6c00
3.2 服务端错误 (5xx - 服务器的锅)
graph TD
Server["服务器处理"] --> Crash{"是否崩溃?"}
Crash --"代码崩了"--> 500["500: Internal Error"]
Crash --"网关不通"--> 502["502: Bad Gateway"]
Crash --"处理超时"--> 504["504: Gateway Timeout"]
style 500 fill:#ffcdd2,stroke:#c62828
style 502 fill:#ffcdd2,stroke:#c62828
style 504 fill:#ffcdd2,stroke:#c62828
4. 避坑指南
| ❌ 不要这样做 | ✅ 应该这样做 | 为什么 |
|---|---|---|
| 永远 200 | 使用标准状态码 | API 永远返回 200,错误信息写在 Body 里 {code: -1}。这会让监控系统失效,Sentry 以为你是成功的。 |
| 混用 401/403 | 区分未登录与无权限 | 401 是“你是谁?(身份认证)”,403 是“我知道你是谁,但你不配 (权限不足)”。 |
| 滥用 301 | 先尝试 302 | 301 是永久重定向,浏览器会缓存很久。如果你将来想改回来,用户浏览器里存的还是旧地址,这会让你非常痛苦。 |
5. 真实案例
Story
2015年,永远成功的 API
某大厂曾规定所有 API 必须返回 200,业务错误码自己定义。 结果有一天,网关层(Nginx)配置错误,真的把所有请求都拦截了返回 200 (一个 HTML 错误页)。 APP 端解析 JSON 失败导致崩溃,但监控大盘上却是一条平滑的“成功率 100%”直线(因为全回了 200)。运维直到接到大量客诉才发现问题。
Vibe 心法:HTTP 状态码是互联网的基础设施语言。尊重标准,不要试图发明“永远 200”的异端。让 4xx 和 5xx 成为监控系统的哨兵,才能真正实现大规模系统的自动化巡检。
6. 本章小结
- 甩锅神器:4xx 是客户端的错,5xx 是服务器的错。
- 304:是 HTTP 缓存机制的核心,性能优化的关键。
- Respect Standards:遵循标准,你的工具链(浏览器、监控、CDN)才能正常工作。