HTTP 常见状态码有哪些?

基础高频约 6 分钟读完

一句话回答

状态码分五类:1xx 信息、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误。最常考的几组是:301 / 302 永久和临时重定向,304 协商缓存命中,401 / 403 未认证和没有权限,502 / 504 网关收到上游的无效响应和等待上游超时。

详细解析

五类状态码

类别 含义
1xx 信息 请求已收到,还需要继续处理
2xx 成功 请求被成功处理
3xx 重定向 需要客户端进一步操作,比如跳到新地址
4xx 客户端错误 请求本身有问题,比如参数错误、没有权限、资源不存在
5xx 服务端错误 请求没问题,服务器处理时出了错

常见状态码

状态码 含义 典型场景
101 Switching Protocols 切换协议 WebSocket 握手,从 HTTP 升级到 WebSocket(见 WebSocket)
200 OK 成功 绝大多数正常的请求
201 Created 已创建新资源 POST 创建资源成功,可以在 Location 头里返回新资源的地址
204 No Content 成功,但没有响应体 DELETE 成功、CORS 预检请求的响应
206 Partial Content 返回了部分内容 范围请求,用于断点续传、视频拖动播放(见 大文件上传)
301 Moved Permanently 永久重定向 网站换域名。浏览器会缓存这个跳转,搜索引擎会把权重转移到新地址
302 Found 临时重定向 未登录时跳转到登录页
304 Not Modified 资源没变,继续用本地缓存 协商缓存命中(见 HTTP 缓存)
307 Temporary Redirect 临时重定向,不改变请求方法和请求体 临时把 POST 接口转到新地址
308 Permanent Redirect 永久重定向,不改变请求方法和请求体 API 地址永久迁移
400 Bad Request 请求有误 参数校验失败、JSON 格式错误
401 Unauthorized 未认证 没有登录、token 过期
403 Forbidden 已认证,但没有权限 普通用户访问管理员接口
404 Not Found 资源不存在 路径写错、资源已删除
405 Method Not Allowed 不支持这个请求方法 对只支持 GET 的接口发 POST
409 Conflict 和资源的当前状态冲突 重复创建、并发修改导致版本冲突
413 Content Too Large 请求体过大(旧称 Payload Too Large) 上传的文件超过服务器限制,比如 Nginx 的 client_max_body_size
429 Too Many Requests 请求太频繁 触发限流,可以用 Retry-After 头告诉客户端多久后再试
500 Internal Server Error 服务器内部错误 代码抛出了未捕获的异常
502 Bad Gateway 网关或代理从上游服务收到了无效响应 上游服务挂了或崩溃
503 Service Unavailable 服务暂时不可用 服务过载、维护中
504 Gateway Timeout 网关等待上游响应超时 上游处理太慢,比如遇到慢查询

301、302、307、308 怎么区分

可能把 POST 改成 GET 保证不改变请求方法和请求体
永久重定向 301 308
临时重定向 302 307

浏览器收到 301、302 后,可能把原来的 POST 请求改成 GET 去请求新地址,这是历史遗留的行为,规范后来也允许了。307 和 308 就是为了明确"请求方法和请求体保持不变"而补充的。另外还有 303 See Other,它明确要求改用 GET 请求新地址,常用于提交表单后跳转到结果页。

状态码和业务错误码

HTTP 状态码表示请求层面的结果,粒度比较粗;具体的业务原因(如"库存不足""优惠券已过期")放在响应体的业务码里。比如登录失效统一返回 401,再用响应体里的 code 区分是 token 过期还是账号在别处登录。接口设计规范见 RESTful API 设计。

面试官可能追问

401 和 403 有什么区别?

401 是"不知道你是谁":没带凭证或者凭证失效,重新登录、刷新 token 后就可能访问成功。规范要求 401 响应带上 WWW-Authenticate 头,说明认证方式。403 是"知道你是谁,但你没有权限",重新登录也没用。前端一般对 401 跳转登录页或刷新 token,对 403 提示无权限。有些服务对没有权限的资源直接返回 404,连资源是否存在都不暴露。

502 和 504 有什么区别?分别怎么排查?

两者都由网关(如 Nginx)返回,问题通常出在上游服务。

  • 502:网关连接上游失败(比如连接被拒绝),或者收到了无效的响应。常见原因是上游进程挂了、端口没在监听、处理请求时崩溃断开了连接。排查时看上游进程是否存活、端口是否在监听,以及网关的错误日志
  • 504:上游还活着,但没有在网关的超时时间(如 Nginx 的 proxy_read_timeout)内返回响应。排查时看上游的慢日志、慢 SQL 和依赖的第三方接口,必要时把耗时任务改成异步(见 接口请求很慢怎么排查)
为什么有些项目所有接口都返回 200?利弊是什么?

好处是前端只需要按响应体里的业务码处理,逻辑统一;很多请求库(如 axios)默认把非 2xx 的响应当成异常,统一返回 200 写起来更省事。坏处是违背了 HTTP 语义:监控和网关无法按状态码统计错误率、触发告警;错误响应可能被 CDN 或浏览器当成正常结果缓存;排查问题时必须解析响应体。比较推荐的做法是用 HTTP 状态码表示大类,用业务码表示细节。

易错点

  • 304 不是错误,它表示协商缓存命中,浏览器继续使用本地缓存
  • 401 的名字叫 Unauthorized,实际含义是"未认证";"没有权限"应该用 403
  • 502、504 都由网关返回,但问题通常出在上游服务,不是网关本身

AI 模拟面试官

用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮

登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录

这道题你掌握了吗?

选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。

学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。