HTTP状态码
HTTP状态码是HTTP协议中,服务器向客户端告知请求处理结果的3位数字代码,核心规范来自RFC 7231(HTTP/1.1语义标准),首位数字固定划分5个基础分类,覆盖请求处理的全流程结果。以下按分类结构化梳理,标注核心常用码、标准定义、适用场景及关键特性,兼顾规范严谨性与开发运维的实际使用。
一、1xx 信息性状态码(Informational)
核心定义:服务器已接收请求,正在处理中,需客户端等待后续最终响应。属于临时响应,仅包含状态行和可选响应头,无响应体。
| 状态码 | 核心标识 | 标准定义与适用场景 | 关键特性 |
|---|---|---|---|
| 100 Continue | 核心常用 | 服务器已校验并接收请求头,通知客户端继续发送请求体(POST/PUT等大体积请求) | 用于客户端带Expect: 100-continue头的场景,避免大文件传输无效浪费带宽 |
| 101 Switching Protocols | 常用 | 服务器同意客户端的协议切换请求(通过Upgrade头指定) |
典型场景:WebSocket连接建立、HTTP/1.1升级至HTTP/2,响应头会明确切换后的协议 |
| 103 Early Hints | 近年常用 | 服务器在最终响应前,提前返回带Link头的预加载指令 |
用于浏览器提前预加载CSS、JS等静态资源,优化页面首屏加载性能,RFC 8297规范定义 |
| 102 Processing | 扩展常用 | 服务器已接收请求并正在处理,暂无可用响应,避免客户端超时 | WebDAV扩展(RFC 2518),用于耗时较长的批量文件操作场景 |
二、2xx 成功状态码(Success)
核心定义:服务器已成功接收、理解并处理客户端的请求,是请求的理想响应类别。
| 状态码 | 核心标识 | 标准定义与适用场景 | 关键特性 |
|---|---|---|---|
| 200 OK | 最核心最常用 | 请求完全成功,服务器已返回请求的目标资源 | 适配GET/POST/PUT等绝大多数请求:GET返回资源体,POST/PUT返回操作结果,是HTTP最通用的成功码 |
| 201 Created | 核心常用 | 请求成功,且服务器已创建新的资源 | 用于POST/PUT创建资源的场景(如新增用户、上传文件),响应头通常带Location指向新资源的URI |
| 202 Accepted | 常用 | 服务器已接收请求,但尚未完成处理 | 用于异步任务场景(如批量导入、视频转码、邮件发送),可返回任务ID供客户端轮询,不保证最终处理成功 |
| 204 No Content | 核心常用 | 请求成功,但服务器无任何响应体返回 | 用于DELETE删除资源、PUT更新资源无需返回内容的场景,客户端无需刷新页面,仅需确认操作成功 |
| 206 Partial Content | 核心常用 | 服务器成功处理客户端的范围请求,仅返回资源的指定片段 | 用于断点续传、视频分片加载,请求头带Range,响应头带Content-Range标注分块字节范围 |
| 205 Reset Content | 补充 | 请求成功,要求客户端重置文档视图(如清空表单内容) | 与204的核心区别:强制要求客户端重置UI,典型场景为表单提交后自动清空所有输入项 |
| 207 Multi-Status | WebDAV扩展 | 一次请求返回多个独立子操作的处理状态,响应体包含每个子操作的状态码 | 用于WebDAV批量操作文件/文件夹,一次性返回多个资源的处理结果 |
三、3xx 重定向状态码(Redirection)
核心定义:客户端需要执行额外操作才能完成请求,主要用于资源跳转、缓存控制,核心分为永久重定向和临时重定向,关键差异为是否保留原始请求方法、是否被浏览器缓存。
| 状态码 | 核心标识 | 标准定义与适用场景 | 关键特性 |
|---|---|---|---|
| 301 Moved Permanently | 核心常用(永久重定向) | 资源已永久移动到新URI,后续所有请求应使用新地址 | 浏览器会永久缓存重定向地址;部分旧浏览器会将原始POST请求改为GET;典型场景:域名更换、页面永久迁移、SEO权重转移 |
| 302 Found | 核心常用(临时重定向) | 资源临时移动到新URI,客户端本次使用新地址,后续仍使用原地址 | 浏览器不缓存重定向地址;历史规范问题,多数旧浏览器会将POST改为GET;典型场景:未登录跳转登录页、临时活动页跳转 |
| 303 See Other | 常用 | 请求处理成功,引导客户端使用GET方法跳转到新URI获取结果 | 强制将POST/PUT/DELETE请求改为GET跳转,无缓存;典型场景:表单POST提交成功后跳转结果页,避免用户刷新重复提交 |
| 304 Not Modified | 核心常用(缓存专用) | 资源未发生修改,客户端可直接使用本地缓存 | 无响应体;触发条件为客户端带If-Modified-Since/If-None-Match头,服务器校验资源未变更;典型场景:浏览器静态资源(图片、CSS、JS)缓存,减少带宽消耗 |
| 307 Temporary Redirect | 核心常用(临时重定向) | 资源临时移动到新URI,严格保留原始请求方法和请求体 | 与302的核心区别:强制不修改请求方法,不会转为GET;无缓存;典型场景:RESTful API POST/PUT请求的临时跳转,避免业务异常 |
| 308 Permanent Redirect | 常用(永久重定向) | 资源已永久移动到新URI,严格保留原始请求方法和请求体 | 与301的核心区别:强制不修改请求方法,不会转为GET;浏览器永久缓存;典型场景:API接口域名永久更换,需保留非GET请求的方法和body |
补充:305、306状态码已被RFC 7231弃用,存在安全风险,现代浏览器均不支持,无实际使用场景。
四、4xx 客户端错误状态码(Client Error)
核心定义:请求存在语法、权限、参数、资源等问题,服务器无法或拒绝处理,错误根源在客户端,是开发调试中最常遇到的类别。
| 状态码 | 核心标识 | 标准定义与适用场景 | 关键特性 |
|---|---|---|---|
| 400 Bad Request | 核心常用 | 服务器无法理解请求,因客户端请求存在语法错误、格式无效 | 通用客户端错误码,典型场景:JSON请求体格式错误、URL编码异常、请求参数格式非法、请求头过大 |
| 401 Unauthorized | 核心常用 | 请求需要用户身份认证,客户端未提供凭证或凭证无效 | 响应头必须带WWW-Authenticate标注认证方式(如Bearer Token、Basic认证);典型场景:未携带Token访问接口、Token过期/签名错误、账号密码错误;语义为「未认证」,而非「未授权」 |
| 403 Forbidden | 核心常用 | 服务器已理解请求,但拒绝执行,即使认证成功也无权访问 | 与401核心区别:401是「身份无效/未登录」,403是「已登录,但无权限」;典型场景:普通用户访问管理员接口、IP被封禁、跨域请求被拦截、CSRF令牌无效 |
| 404 Not Found | 最常用客户端错误 | 服务器无法找到请求的资源,URI无效或资源已删除/不存在 | 典型场景:URL拼写错误、资源已永久删除、路由未配置、接口地址写错 |
| 405 Method Not Allowed | 核心常用 | 请求的URI存在,但不支持客户端使用的HTTP方法 | 响应头必须带Allow,列出该URI支持的合法方法;典型场景:仅支持GET的接口被POST请求访问、RESTful接口方法使用错误 |
| 409 Conflict | 核心常用 | 请求与服务器资源的当前状态存在冲突,无法完成处理 | 典型场景:并发修改同一资源(乐观锁冲突)、创建已存在的唯一资源(重复注册用户名)、资源状态不允许操作(已付款订单重复支付) |
| 413 Payload Too Large | 核心常用 | 客户端请求体大小超过服务器限制,服务器拒绝处理 | 典型场景:上传超大文件、POST提交的JSON体过大,超出Nginx/后端服务的body上限 |
| 414 URI Too Long | 常用 | 客户端请求的URI长度超过服务器限制,服务器拒绝处理 | 典型场景:GET请求带超长query参数、URL拼接过多参数,超出浏览器/服务器的URI长度限制 |
| 415 Unsupported Media Type | 核心常用 | 服务器不支持客户端请求的Content-Type格式,无法处理请求体 |
典型场景:接口要求application/json,客户端携带form-data/text/plain、上传文件格式不被支持 |
| 422 Unprocessable Entity | 核心常用(API开发) | 服务器已理解请求的Content-Type、语法正确,但无法处理请求的语义内容 |
与400核心区别:400是语法错误,422是业务语义校验失败;典型场景:请求参数格式正确,但密码长度不足、手机号格式非法、必填参数为空 |
| 429 Too Many Requests | 核心常用(限流防刷) | 客户端单位时间内请求数超过服务器限制,触发限流 | 响应头通常带Retry-After告知重试间隔;典型场景:API接口限流、防爬虫、短信验证码防刷、登录失败次数限制 |
| 431 Request Header Fields Too Large | 常用 | 客户端请求头单个字段或总大小超过服务器限制 | 典型场景:Cookie体积过大、自定义请求头超长,超出Nginx等服务器的header上限 |
| 451 Unavailable For Legal Reasons | 常用 | 因法律合规要求,服务器拒绝提供该资源 | 典型场景:版权保护内容、地域限制内容、被依法封禁的资源,命名致敬《华氏451》 |
| 418 I'm a teapot | 彩蛋非标准 | 超文本咖啡壶控制协议(RFC 2324)愚人节彩蛋,服务器拒绝用茶壶煮咖啡 | 无正式业务场景,多用于开发者调试、反爬虫、趣味页面 |
补充:402 Payment Required为预留状态码,最初用于数字支付场景,目前未被广泛标准化使用;407、408、410、411、412、416、417、421、426、428等为标准补充码,用于特定细分场景,日常开发中使用频率较低。
五、5xx 服务器错误状态码(Server Error)
核心定义:服务器处理合法请求时,发生了内部错误,无法完成请求,错误根源在服务端,是运维、后端开发重点监控的类别。
| 状态码 | 核心标识 | 标准定义与适用场景 | 关键特性 |
|---|---|---|---|
| 500 Internal Server Error | 最核心最常用服务端错误 | 服务器处理请求时发生未预期的内部错误,无更精准的错误码可用 | 通用服务端错误码,典型场景:后端代码运行时异常(空指针、SQL执行错误)、业务逻辑崩溃、服务器配置错误 |
| 501 Not Implemented | 常用 | 服务器不支持客户端请求的功能,无法完成处理 | 与405核心区别:405是方法存在但URI不支持,501是服务器根本不支持该方法/功能;典型场景:客户端使用服务器未实现的HTTP方法、请求的功能未开发完成 |
| 502 Bad Gateway | 核心常用 | 作为网关/代理的服务器,从上游源服务器收到了无效的响应 | 典型场景:Nginx反向代理的后端服务崩溃、端口未监听、PHP-FPM未启动、网关与上游服务通信协议错误 |
| 503 Service Unavailable | 核心常用 | 服务器当前无法处理请求,属于临时过载或维护,稍后可恢复 | 响应头通常带Retry-After告知恢复时间;典型场景:服务停机维护、服务器流量过载、熔断降级触发、服务重启中 |
| 504 Gateway Timeout | 核心常用 | 作为网关/代理的服务器,等待上游源服务器响应超时 | 与502核心区别:502是收到了无效响应,504是超时未收到响应;典型场景:后端慢SQL、死循环、第三方接口超时,超出网关的超时时间限制 |
| 505 HTTP Version Not Supported | 补充 | 服务器不支持客户端请求使用的HTTP协议版本 | 典型场景:客户端使用HTTP/0.9、HTTP/3等服务器不兼容的协议版本发送请求 |
| 507 Insufficient Storage | WebDAV扩展 | 服务器存储空间不足,无法完成请求操作 | 典型场景:WebDAV上传文件时服务器磁盘已满、数据库存储空间不足 |
| 511 Network Authentication Required | 常用 | 客户端需要完成网络身份认证才能访问网络 | 典型场景:酒店、机场、咖啡厅的Wi-Fi门户认证,未登录前访问网页会返回该状态码 |
补充说明与使用规范
- 规范来源:核心状态码由RFC 7231定义,扩展码来自RFC 2518(WebDAV)、RFC 6585(附加状态码)、RFC 8297(103 Early Hints)等官方标准。
- 业务自定义规范:企业通常在标准HTTP状态码基础上,通过响应体的
code字段定义细分业务错误码;HTTP状态码仅负责标识HTTP协议层的处理状态,业务错误码负责细分业务场景的错误原因。 - 常见使用误区
- 混淆401与403:401是「未登录/身份无效」,403是「已登录,但无权限」;
- 混淆302与307:302可能将POST转为GET,307严格保留原始请求方法;
- 滥用500:所有服务端错误都返回500,应根据场景使用更精准的状态码;
- 全量200返回:无论成功失败都返回200,仅通过body标识错误,不符合HTTP语义规范,不利于网关监控、CDN缓存与SEO。
六、思维导图
