HTTP 状态码规范:RFC 7231: Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content、RFC 9110: HTTP Semantics
本文的部分状态码取自 RFC 2774: An HTTP Extension Framework、RFC 8297: An HTTP Status Code for Indicating Hints
这篇文章是自用的 HTTP 状态码速查表,不敢说最全但肯定比网上能搜到的大多数齐全多了
转载请注明出处 作者 Moushudyx
内容截至 2026-04-29
信息(Informational) 1xx
“请求得到接收,继续处理”
100 继续(Continue)
标准状态码,服务器已校验并接收请求头,通知客户端继续发送请求体
一般来说是客户端先发送带有请求头 Expect: 100-continue 的请求,服务端如果检查通过,会返回 100 表示继续,此时客户端会发送后续请求
此操作一般由浏览器自动完成,常见于上传大文件之类的场景
101 切换协议(Switching Protocols)
标准状态码,也称“协议升级”,客户端要求切换当前协议的时候用到
客户端发送 Upgrade 头(如 Upgrade: websocket + Connection: Upgrade )
以前用于 h2c,现在好像除了升级为 websocket 之外见不到了?
(废弃) 102 处理中(Processing)
废弃状态码,来自 RFC 2518,后在 RFC 4918 中明确声明为废弃
原用于 WebDAV,告知客户端“请求正在处理,请勿超时”
103 预加载提示(Early Hints)
实验阶段,详见 RFC 8297,但已经有厂家用起来了
一般是服务器在处理事务时,提醒客户端(也就是浏览器)提前预加载一些资源,这样后续渲染会更快
成功(Successful) 2xx
“请求成功接收,并得到理解和接受”
200 正常(OK)
标准状态码,请求已成功,实际返回的内容取决于请求方法:
- GET:返回所请求资源
- HEAD:返回与 GET 相同的响应头,但无响应体
- POST:返回操作结果或新资源
- PUT / DELETE:返回操作结果
对 GET 和 HEAD 而言,200 表示资源已获取并放在消息体中
最常见的 2xx 状态码
201 已创建(Created)
标准状态码,请求已完成,并因此创建了一个或多个新资源
响应的 Location 头字段通常包含指向已创建资源(即主资源)的引用
常用于 REST API 中 POST 请求成功后返回新资源的 URI——虽说实际项目中的后端可能没那么规矩
202 已接受(Accepted)
标准状态码,请求已被接受但尚未处理,适合异步处理场景
此类响应会告诉客户端后续处理已经提上日程,无需等到处理完成再断开客户端连接
请求最终可能执行,也可能不执行,这一点务必注意
204 无内容(No Content)
标准状态码,服务器已成功处理请求,但不在响应体中返回任何内容(payload body),以响应头后的第一个空行结束
通常用在 PUT 更新、DELETE 删除等只需确认成功不需要返回内容的操作;也可配合 ETag 等让客户端更新缓存
206 部分内容(Partial Content)
标准状态码,表明服务器成功处理了一个 范围请求(Range Request),只传输了资源的部分内容
响应包含请求头 Range 所指定范围的数据,一般用于视频拖动进度条、断点续传等只加载部分资源的场景
响应必须包含 Content-Range 头来说明本次传输的是资源的哪一部分
重定向(Redirection) 3xx
“想要完成请求需要进一步动作”
301 永久重定向(Moved Permanently)
标准状态码,目标资源已永久迁移到一个新的 URI,以后任何对该资源的引用都应使用新的 URI
注意:搜索引擎会更新索引,把权重转移到新地址
常用于网站域名迁移,以前还用于强制 HTTPS 跳转等场景
302 临时重定向(Found)
标准状态码,目标资源 临时 驻留在另一个 URI 下
注意:
- 重定向后,客户端可能把 POST 改为 GET(历史遗留问题),搜索引擎不会转移权重
- 如果想要强制使用 GET 或者保留请求方法,可以使用下文的 302/307
一般用于未登录跳转、临时页面(活动页)等场景
303 查看其它(See Other)
标准状态码,服务器要求客户端使用 GET 方法请求另一个 URI 获取响应,无需传输已缓存资源
注意:303 响应本身不能缓存,但对第二个(重定向后)请求的响应可以被缓存
常用于 POST 后跳转到确认页面(Post-Redirect-Get 模式)
304 未修改(Not Modified)
标准状态码,表明自上次请求以来,资源未发生修改,不需要重新传输(对缓存资源的隐式重定向)
当请求方法为 GET 或 HEAD,且携带 If-None-Match 或 If-Modified-Since 这类条件请求头时,服务器可返回 304 告知客户端继续使用本地缓存,节省带宽
常用于客户端确认缓存是否过期的场景
307 临时重定向(Temporary Redirect)
标准状态码,目标资源临时驻留在另一个 URI 下,后续请求仍使用原 URI——与 302 不同的是,307 明确禁止更改请求方法(POST 必须保持 POST)
建议在需要严格保持请求方法的临时跳转时使用
308 永久重定向(Permanent Redirect)
标准状态码(定义于 RFC 7538),目标资源已被永久移动到新 URI——与 301 不同的是,308 禁止更改请求方法
搜索引擎处理方式与 301 类似
适合需要永久迁移且需保留 POST 等方法的场景
客户端出错(Client Error) 4xx
“请求包含语法错误或不能实现”
400 错误请求(Bad Request)
标准状态码,服务器因客户端错误(如请求语法错误、无效的请求消息帧、欺骗性请求路由等)无法或不会处理请求
最通用的 4xx 状态码(不一定最常见)
401 未授权(Unauthorized)
标准状态码,请求需要用户身份验证,响应包含 WWW-Authenticate 头字段,里面注明了请求资源需要的内容,一般情况下客户端可通过 Authorization 头携带凭证重新请求
常用于用户未登录(或者登录过期)时提示登录的场景
403 禁止访问(Forbidden)
标准状态码,服务器理解请求但拒绝执行(一般是权限不足)
区别于 401,403 多数情况表示“身份验证通过,但你没有权限”
若服务器希望隐藏拒绝原因,可返回 404(类似 gitlab 的处理方式)
404 未找到(Not Found)
标准状态码,服务器无法找到与请求 URI 匹配的任何资源,一般用于链接失效、路径错误、路由未配置等
也可用于服务器不希望透露具体原因时(比方说代替 403,类似 gitlab 的处理方式)
405 方法不允许(Method Not Allowed)
标准状态码,请求的方法对于目标资源不支持,响应包含 Allow 头字段,列出目标资源支持的方法
一般是前后端没对接好会出这个问题
406 不可接受(Not Acceptable)
标准状态码,客户端接受的内容类型服务端无法匹配
也就是请求头的这些东西,服务端无法满足:
- Accept
- Accept-Encoding
- Accept-Language
一般不建议使用这个东西,要用也最好在响应中提示可提供的资源
407 代理需要授权(Proxy Authentication Required)
标准状态码,请求需要用户代理的身份验证,响应中一般会带上 Proxy-Authenticate 提示要如何验证
一般用不上这个东西
408 请求超时(Request Timeout)
标准状态码,服务器在等待接收完整请求时超时,客户端可以重复发送该请求
常见于上传大文件时,由于网络慢或别的原因,导致服务器在规定时间内未收完所有请求数据的场景
409 冲突(Conflict)
标准状态码,与资源的当前状态发生冲突,请求无法完成
常见于多个客户端同时编辑同一资源,服务器端检测到版本不一致(如操作了同一个数据触发了乐观锁)——最好的情况下,响应包含足够信息让用户识别冲突原因
410 已消失(Gone)
标准状态码,目标资源在服务器上不再可用,且服务器知道该资源已永久删除,没有转发地址——与 404 不同的是,410 明确表示该资源已被有意删除
常用于限时活动、过期商品页面的场景(或者 404 一把梭)
413 内容过大(Content Too Large)
标准状态码,服务器拒绝处理请求,因为请求的负载(payload)超过了上限,后续可能关闭连接或在响应里添加 Retry-After 头字段
原 Payload Too Large,在最新 HTTP 语义标准(RFC 9110)中改了名称
常见于上传文件超过服务器限制的场景
414 URI 过长(URI Too Long)
标准状态码,请求的 URI 超过了服务器可解析的长度限制
实际中 URI 过长往往由客户端将表单数据转换为 GET 请求的查询字符串(query string)导致,或重定向循环导致 URL 拼接过程中无限复读
415 不支持的媒体类型(Unsupported Media Type)
标准状态码,服务器拒绝处理请求,因为请求的媒体格式不支持
例如客户端上传 JSON 数据但接口只接受 XML,或干脆就是 Content-Type 拼写错误
422 无法处理的实体(Unprocessable Entity)
扩展状态码,RFC 4918(WebDAV),请求格式正确、语法无误,但因语义错误服务器无法处理包含的指令
与 400 不同,422 侧重于请求体内容逻辑有误而非语法/格式问题
目前在 REST API 中广泛使用
429 请求过多(Too Many Requests)
扩展状态码,RFC 6585,客户端在给定时间内发送了过多请求(俗称“触发限流”),响应中包含 Retry-After 头字段,告知客户端多久后可以重试
该响应不能被缓存
服务端出错(Server Error) 5xx
“请求看着没问题,但服务端处理失败”
500 服务器内部错误(Internal Server Error)
标准状态码,服务器遇到意外情况,导致无法完成请求,最通用的服务端错误码(也可能是最常见的)
通常在代码抛出未捕获异常、数据库连不上、配置文件出错等未知错误时由后端框架返回——谢谢 Spring boot
501 未实现(Not Implemented)
标准状态码,服务器不支持完成请求所需的功能。意为服务器不可识别请求方法且无法支持任何资源
常见于服务器不支持的 HTTP 方法(如 PATCH);若方法已知但资源不支持,应返回 405 方法不允许(Method Not Allowed)
502 网关错误(Bad Gateway)
标准状态码,服务器在充当网关或代理时,从上游服务器收到了无效响应(如连接被拒绝、响应格式错误等)
常见于上游应用挂了、CGI 进程崩溃、Nginx 代理的后端没启动等场景
503 服务不可用(Service Unavailable)
标准状态码,服务器暂时无法处理请求,响应可能包含 Retry-After 头字段告知客户端预计恢复时间——503 往往暗示不可用的状态是临时的
常见于死机、过载、维护/升级中(比如服务正在发版)的场景,如果是生产环境可能就是事故
504 网关超时(Gateway Timeout)
标准状态码,服务器作为网关或代理时,在指定时间内没有从上游服务器收到及时响应
常见于 Nginx 等反向代理等待业务处理超时,如 PHP 执行过久、数据库查询耗时过长等
505 HTTP 版本不支持(HTTP Version Not Supported)
标准状态码,服务器不支持请求所使用的 HTTP 版本
一般不会出现,如果出现了建议升级 Nginx
后记
还有一些懒得记录了,这里罗列一下:
- 208 Already Reported 同一个资源之前请求过了,这个只在 WebDAV 里有,正常应该碰不上
- 233 Moushudyx 这个不是状态码,是本文作者昵称
- 416 Range Not Satisfiable 请求的资源范围不太对
- 417 Expectation Failed 请求头里的
Expect无法满足 - 418 I'm a teapot 服务器是个茶壶不能煮咖啡(愚人节玩笑,有的网站会用于对付脚本)
- 422 Unprocessable Entity 请求里携带的实体有问题
- 426 Upgrade Required 快升级你的 HTTP 协议
- 451 Unavailable For Legal Reasons 刑啊,很刑啊
- 507 Insufficient Storage 服务器没空间了
- 508 Loop Detected 服务器死循环了,这个只在 WebDAV 里有,正常应该碰不上
- 510 Not Extended 服务器没有对应的 HTTP 拓展(RFC 2774),这个应该碰不上
- 511 Network Authentication Required 这个错一般是代理服务器报的,表示代理服务器需要身份认证