一、五类状态码
- 1xx 信息:请求已收到、继续处理,日常开发很少直接见到(100 Continue、101 协议切换)。
- 2xx 成功:200 OK、201 已创建、204 无内容(常见于 DELETE 成功)、206 分片内容(断点续传/视频)。
- 3xx 重定向:301 永久、302 临时、304 缓存未变、307/308 保留方法与 body 的重定向。
- 4xx 客户端错误:请求本身有问题,400 参数错、401 未认证、403 无权限、404 不存在、405 方法不允许、429 限流。
- 5xx 服务端错误:500 通用错误、502 网关错误、503 服务不可用、504 网关超时。
一个实用的责任划分:4xx 先查调用方(参数、鉴权、路径),5xx 先查服务端(日志、依赖、负载)。
二、几组最容易混淆的
301 vs 302:301 表示资源永久迁移,搜索引擎会把旧 URL 的权重转移到新地址,浏览器也会强缓存;302 是临时跳转,不转移权重、不长期缓存。站点换域名、http 跳 https、规范化 www,应该用 301;活动页临时跳复用 302。用错 302 做永久迁移,是 SEO 权重流失的常见原因。
401 vs 403:401 是「你是谁还不知道」——没带或带了无效的凭证,响应应带 WWW-Authenticate 提示登录;403 是「知道你是谁,但你没权限」——登录了也访问不了,重新登录也没用。前端遇到 401 跳登录页,遇到 403 应该展示无权限提示。
404 vs 410:404 是「暂时没找到」,搜索引擎过段时间还会再来抓;410 是「永久删除、不会再有」,能更快让搜索引擎清理索引。整站改版批量下线页面,410 比 404 更干脆。
400 vs 422:400 是请求格式/参数本身不合法;422 是格式没问题但语义校验没过(字段值不合规)。不少框架用 422 承载表单校验错误。
三、常见状态码速查
200 请求成功
201 创建成功(POST 新建资源)
204 成功但无返回体
301 永久重定向(SEO 权重转移)
302 临时重定向
304 资源未修改,走缓存
400 请求参数/格式错误
401 未认证(需要登录)
403 已认证但无权限
404 资源不存在
405 请求方法不允许
408 请求超时
429 请求过于频繁(限流)
500 服务端内部错误
502 网关/反向代理拿到无效响应
503 服务暂时不可用(维护/过载)
504 网关等待上游超时
四、线上排查思路
先看状态码落在 4xx 还是 5xx 定责任方;再看时间点和请求路径是否集中;然后按链路往上游查:客户端 → CDN/负载均衡 → 网关(Nginx) → 应用 → 数据库/第三方依赖。502/504 通常是网关等不到上游,重点查应用进程和超时配置;503 常见于发布、扩容、限流;429 要先确认是自身限流还是对方限流。
调试时可以配合 HTTP 状态码速查 快速确认含义,用 User-Agent 解析 判断异常请求来自哪类客户端。做站点改版时,把旧 URL 用 301 指向新地址、并让 canonical 与最终域名保持一致,是避免权重分散的关键一步。
五、SEO 相关提醒
软 404(页面不存在却返回 200 并展示「未找到」)会让搜索引擎收录大量无意义页面;把所有错误都返回 200 再在 JSON 里写 code: 404,同样不利于爬虫识别。正确做法是让 HTTP 状态码如实反映结果,再配一个友好的错误页。
小结
4xx 查调用方、5xx 查服务端;永久迁移用 301、临时用 302;401 是没登录、403 是没权限。状态码如实返回,排查和 SEO 都会少走很多弯路。