HTTP 状态码大全:从 200 到 503 完整解读
HTTP 状态码完整指南,涵盖 1xx-5xx 所有常见状态码的含义、使用场景和排查方法。
HTTP 状态码是服务器对客户端请求的响应代码,分为 5 大类。
状态码描述的是本次 HTTP 请求的处理结果。它不等同于页面视觉效果:一个精美错误页仍应返回 404,一个正文为空的成功请求也可能正确返回 204。开发、监控和 SEO 排查都应先读取状态码,再结合响应头与正文判断。
1xx 信息响应
1xx 表示服务器已经收到请求,连接仍在继续处理。普通网页开发中不常直接看到,但在代理、上传和协议升级场景十分重要。
- 100 Continue:客户端可以继续发送请求体
- 101 Switching Protocols:切换协议,例如 WebSocket 握手
- 103 Early Hints:在最终响应前提示客户端预加载资源
中间代理若不理解这些响应,可能导致上传中断、连接异常或预加载无效。排查时应确认客户端、CDN 与源站对协议特性的支持一致。
2xx 成功
- 200 OK - 请求成功
- 201 Created - 资源创建成功
- 204 No Content - 成功但无返回内容
- 202 Accepted - 请求已接收,但任务仍在异步处理
- 206 Partial Content - 返回资源的一部分,常见于视频和断点续传
200、201、202、204 的区别
| 状态码 | 适用场景 | 响应要求 |
|---|---|---|
| 200 | 查询或同步操作完成 | 通常包含结果正文 |
| 201 | 新资源已创建 | 建议通过 Location 指出资源地址 |
| 202 | 已进入异步队列 | 应提供任务状态查询方式 |
| 204 | 操作成功但无需正文 | 响应不应包含消息体 |
API 不应为了“统一前端处理”而把所有结果都包装成 200。创建、异步任务和无正文成功使用准确状态码,可以让客户端、网关与监控系统更可靠地处理请求。
3xx 重定向
- 301 Moved Permanently - 永久重定向
- 302 Found - 临时重定向
- 304 Not Modified - 使用缓存
- 303 See Other - 引导客户端使用 GET 查看另一个资源
- 307 Temporary Redirect - 临时跳转并保留请求方法
- 308 Permanent Redirect - 永久跳转并保留请求方法
304 不是普通页面跳转,它只用于条件请求。客户端发送 If-None-Match 或 If-Modified-Since 后,服务器用 304 表示缓存副本仍可使用,因此响应通常没有完整正文。
4xx 客户端错误
- 400 Bad Request - 请求格式错误
- 401 Unauthorized - 未认证
- 403 Forbidden - 无权限
- 404 Not Found - 资源不存在
- 429 Too Many Requests - 请求过于频繁
- 405 Method Not Allowed - 路径存在,但请求方法不允许
- 408 Request Timeout - 服务端等待请求超时
- 409 Conflict - 请求与资源当前状态冲突
- 410 Gone - 资源已明确永久删除
- 422 Unprocessable Content - 语法有效,但业务校验失败
- 451 Unavailable For Legal Reasons - 因法律原因不可用
401 与 403 不一样
401 表示客户端尚未提供有效认证信息,通常应附带 WWW-Authenticate。403 表示服务器理解请求,但拒绝当前主体访问。把所有权限问题都返回 403,会让客户端无法判断应该重新登录还是停止重试。
404、410 与软 404
404 适合“不存在或不愿透露是否存在”的资源;410 明确表示资源已经永久移除。软 404 则是页面显示“内容不存在”,HTTP 却返回 200。软 404 会污染可用性监控、缓存和搜索索引,应尽量避免。
5xx 服务器错误
- 500 Internal Server Error - 服务器内部错误
- 502 Bad Gateway - 网关错误
- 503 Service Unavailable - 服务不可用
- 501 Not Implemented - 服务器不支持请求所需能力
- 504 Gateway Timeout - 网关等待上游响应超时
500、502、503、504 如何区分?
| 状态码 | 错误位置 | 常见原因 |
|---|---|---|
| 500 | 当前应用 | 未捕获异常、配置错误、代码缺陷 |
| 502 | 网关收到无效上游响应 | 进程退出、协议错误、连接被重置 |
| 503 | 服务主动不可用 | 维护、过载、熔断、无健康实例 |
| 504 | 网关等待上游超时 | 慢查询、依赖超时、网络阻塞 |
客户端重试策略也应不同。对明确的业务 4xx 不应盲目重试;对 503、504 等临时错误,可以采用有限次数、指数退避并加入随机抖动,避免故障期间形成重试风暴。
会影响 SEO 的状态码
- 301/308 表示永久迁移,应直接跳转到首选 URL。
- 302/307 适合临时迁移,原 URL 通常仍是首选地址。
- 404 表示资源不存在;410 更明确地表示资源已被主动删除。
- 429 表示请求过多,条件允许时应同时返回
Retry-After。 - 长期出现 5xx 会让搜索引擎降低抓取频率。
重定向状态码的选择和方法保留差异,可继续阅读301、302、307、308 对比指南。
响应头如何帮助定位状态码问题?
状态码只是入口,响应头能解释请求经过了哪些系统以及客户端下一步应该做什么。
| 响应头 | 排查价值 |
|---|---|
Location | 3xx 的下一跳目标 |
Retry-After | 429、503 后建议等待时间 |
WWW-Authenticate | 401 所需认证方案 |
Allow | 405 路径允许的方法 |
Cache-Control | 错误或跳转是否会被缓存 |
ETag / Last-Modified | 条件请求与 304 验证 |
Via / CDN headers | 响应经过的代理与缓存层 |
Content-Type | 正文格式是否符合客户端预期 |
例如一个错误的 404 被 CDN 缓存,源站即使已经恢复,用户仍可能持续看到旧响应。此时只检查应用日志会得出“源站正常”的错误结论,还需要确认缓存命中和 TTL。
实用排查流程
- 检查初始响应和每一跳,而不只是最终页面。
- 对比浏览器与爬虫 User-Agent,排查针对机器人的异常响应。
- 检查
Location、缓存、认证和 CDN 响应头。 - 确认最终 URL 返回预期状态与正文。
- 修改源站或 CDN 规则后,从公网重新测试。
建立状态码监控体系
建议按路由模板、地区、上游服务和发布版本统计状态码,而不是只看全站汇总。
核心指标包括:
- 2xx 成功率与关键接口成功率
- 3xx 比例、平均跳数和异常目标域名
- 404 Top URL 与来源页面
- 429 触发量、受影响用户和重试行为
- 5xx 比例、持续时间与上游依赖
- P50、P95、P99 响应时间
- CDN 命中与源站状态码差异
告警阈值应结合业务流量设置。低流量接口出现一个 500 可能就是 100% 失败;高流量站点则需要同时关注错误比例、绝对数量和持续窗口。
发布后可以把新增 404、5xx 和重定向变化与版本号关联。这样不仅能发现故障,还能快速判断是哪次配置或部署引入了问题。
运行多身份 URL 检查,可在一份结果中查看状态码、响应头、耗时和完整跳转路径。
常见问题
所有 3xx 都是错误吗?
不是。跳转是 Web 的正常机制。只有目标错误、链路过长或形成循环时才需要修复。
页面不存在时可以返回 200 吗?
不建议。显示错误文案却返回 200 会形成“软 404”,让搜索引擎和监控工具误判。应返回真实的 404 或 410,同时保留友好的错误页面。
429 和 503 应该返回多久后重试?
服务端可以用 Retry-After 给出秒数或日期。客户端仍应设置最大重试次数、总超时和随机抖动;不能因为服务端建议重试,就无限循环请求。
API 校验失败应该用 400 还是 422?
团队需要保持一致。常见做法是:JSON 无法解析、字段类型错误等请求格式问题返回 400;格式正确但违反业务规则时返回 422。无论选择哪种,都应提供稳定的错误码和可定位字段,而不是只返回模糊文本。
HTTP 状态码语义的权威定义可参考 RFC 9110。
使用 URLCheck 工具可以快速检查任意 URL 的状态码,并查看完整的响应头信息。