9. HTTP 常见状态码(热度 280 · 进阶)
Q: 说出常见 HTTP 状态码及含义。
A:
分类与常见码
1xx 信息: 100 Continue(请继续传 body);101 Switching Protocols(协议升级,如 WebSocket)。
2xx 成功: 200 OK;201 Created(常配 Location);204 No Content(无 body,DELETE 常用);206 Partial Content(Range/断点续传)。
3xx 重定向: 301 永久(浏览器会缓存 Location);302 临时(历史客户端可能把 POST 改成 GET);303 临时,且语义就是改用 GET/HEAD 检索 Location(是协议设计不是历史遗留);304 Not Modified(协商缓存命中,无响应体);307 临时且保持方法;308 永久且保持方法。
4xx 客户端错误: 400 语法/参数错;401 未认证;403 无权限/策略拒绝;404 不存在;405 方法不允许;408 请求超时;409 冲突;413 体过大;429 限流(可带 Retry-After)。
5xx 服务端错误: 500 内部错误;502 网关从上游收到非法响应;503 暂不可用;504 网关等待上游超时。
设计动机
- 状态码让客户端可编程处理: 缓存、重试、认证、降级逻辑都依赖语义化的码,而不是解析错误文案。
- 401 vs 403: 401=不知道你是谁(请认证);403=知道你是谁但不允许。
- 502 vs 504: 502 侧重「网关从上游收到无效响应」(非 HTTP、畸形、协议错乱),服务过载/停机是 503;504 侧重「等待上游超时」。中间层(Nginx)语义非常关键。
常见追问
追问 1:301 和 302/307 的缓存与方法语义差异?
- 答题要点: 301 永久,客户端可缓存重定向目标;302 临时不长期缓存;307 临时且强制保持方法与 body;301/302 在历史客户端上可能把 POST 改成 GET,要保持方法应使用 307/308。
追问 2:401 和 403 有什么区别?
- 答题要点: 401 未认证——应引导登录/带 Authorization;403 已认证但无权限或策略禁止——重新登录通常无效。
追问 3:502 和 504 排查方向?
- 答题要点: 502——看后端进程是否存活、端口是否监听、上游是否返回非 HTTP/畸形响应(Nginx error log)。504——看后端处理是否过慢、代理
proxy_read_timeout是否过短、依赖(DB/下游)是否卡死。先比对 Nginx$upstream_status与应用日志。
易错点
| 易错说法 | 纠正 |
|---|---|
| 「304 服务器返回了新内容」 | 304 表示未修改,无 body,用本地缓存 |
| 「404 一定是前端路径写错」 | 也可能是权限隐藏、API 路径、部署版本问题 |
| 「500 和 502 一样」 | 500 应用内部错误;502 多是代理与上游之间 |
| 「401 是没权限」 | 401 是未认证;没权限更多是 403 |
| 「HTTPS 成功就一定是 200」 | 还可能是 301/ 302/ 304/ 4xx/ 5xx |
与选择题对照
- 主库 150: 第 86 题(404)、第 87 题(301)、第 84 题(HTTP 特点)、第 146 题(ETag/协商缓存与 304)、第 145 题(keep-alive=连接层语义,与 Cache-Control 这类头字段语义分工)。
- 补题 16: 无直接状态码选择题;面试向更深。
- 口述联动: 选择题考单个码;面试常考 301 vs 302、401 vs 403、502 vs 504 三组辨析 + 排障。
工程 / 抓包背景
- curl:bash
curl -I https://example.com curl -i https://api.example.com/health curl -v -H "If-None-Match: \"etag\"" https://example.com/ # 期待 304 - Nginx: access log 记录 status;error log 看 upstream 502/504;
proxy_next_upstream决定重试策略。 - 浏览器: Network 面板看 status、From disk cache / memory cache 与 304。
- Wireshark:
http.response.code == 304等过滤。 - 网关排查口诀: 502 看进程与协议;504 看超时与依赖。