如何理解 HTTP 响应的状态码
HTTP 响应状态码用来标识 HTTP 请求的处理结果,原始定义出自 RFC 2616 文档,后续在 RFC 7231 做了更新补充。
状态码一共分为五大类别:
- 1xx:信息,临时响应,需要客户端继续操作
- 2xx:成功,请求已被服务器正常接收、处理
- 3xx:重定向,完成请求还需要后续额外操作
- 4xx:客户端错误,请求存在问题,服务器无法处理
- 5xx:服务器错误,服务器处理请求时发生异常

一般故障排除提示:
- 使用浏览器调试 Web 服务时,修改服务器配置之后务必刷新浏览器,避免读取旧缓存。
- 查阅服务器日志排查问题,Nginx、Apache 等 Web 服务器会生成
access.log(访问日志)和error.log(错误日志),可以从中定位请求完整处理细节。 - HTTP 状态码属于标准定义,但实际返回状态码由服务端软件实现决定,不同服务框架返回的实际码值会存在差异,文档仅作为排查方向参考。
1xx 信息(临时响应)
1xx 属于临时响应,代表请求已经被接收,但还需要继续处理;响应只包含状态行和可选响应头,以空行结束。HTTP/1.0 没有定义 1xx 状态码,除非试验场景,服务器不能对 HTTP/1.0 客户端返回 1xx。
100 Continue(继续)
服务器已经收到请求头,通知客户端可以继续发送请求体(POST 这类带 body 的请求);如果请求已经完成,客户端直接忽略该响应。
使用前提:客户端请求头携带 Expect: 100-continue,发送请求体之前等待 100 响应。
101 Switching Protocols(切换协议)
响应客户端的 Upgrade 请求头,告知客户端服务器即将切换到新协议。典型场景:HTTP 升级为 WebSocket。
102 Processing(WebDAV;RFC 2518)
WebDAV 场景使用。服务器已经接收到请求,正在进行处理,暂时没有可用的完整响应,防止客户端判定请求超时断开连接。
103 Early Hints
配合 Link 响应头使用,服务器还在准备正式响应的时候,允许浏览器提前预加载页面静态资源。
2xx 成功
2xx 代表请求已经被服务器接收、解析、处理完毕。
200 OK(成功)
请求处理成功,响应正文根据请求方法含义不同:
GET:资源已经获取,正文返回资源数据HEAD:只返回响应头,没有响应正文POST:返回本次动作执行后的结果资源TRACE:正文返回服务器收到的原始请求报文
201 Created(已创建)
请求执行成功,服务器创建了新资源。多用于 POST、部分 PUT 新增资源场景,响应一般携带新资源的 Location 地址。
202 Accepted(已接受)
服务器已经收下请求,但还没有完成处理,属于异步处理。无法同步返回执行结果,需要其他后续流程处理任务,资源也不一定能最终创建成功。
203 Non-Authoritative Information(非权威信息,HTTP/1.1)
服务器处理请求成功,但返回的元信息不是源服务器原始数据,来自本地缓存、第三方副本;不是强制返回,仅在不返回 200 的场景才使用。
204 No Content(无内容)
服务器成功处理请求,没有响应正文。客户端可以拿响应头更新本地缓存。
205 Reset Content(重置内容)
服务器处理成功,无响应正文;通知客户端重置当前页面文档视图。典型场景:表单提交完成,清空表单输入,让用户重新输入。禁止携带响应体。
206 Partial Content(部分内容)
针对带 Range 请求头的分片请求,服务器返回资源的一部分。用于断点续传、大文件分片下载、视频流式加载。如果设置了条件校验,会配合 If-Range 头一起使用。
207 Multi-Status(多状态,WebDAV;RFC 2518)
响应体内返回 XML,一个请求对应多个子资源操作,每个子请求各自返回独立状态码。
208 Already Reported(已报告,WebDAV;RFC 5842)
DAV 协议中,避免重复枚举同一个集合下多个绑定的内部成员。
226 IM Used(RFC 3229)
服务器完成 GET 请求,响应表示对资源实例执行增量操作后的结果。
3xx 重定向
3xx 表示想要完成请求,还需要执行额外操作,绝大多数场景用于重定向。
浏览器遇到重定向,只有后续请求方法为 GET、HEAD 时,才可以自动跳转;客户端必须检测无限重定向循环,HTTP 规范建议浏览器自动跳转不超过 5 次。
300 Multiple Choices(多种选择)
请求资源存在多个可选响应,客户端、用户从中选择一个。响应可以在 Location 给出服务器优选地址,该响应允许被缓存。
301 Moved Permanently(永久移动)
资源永久迁移到新 URI,响应头 Location 给出新地址。GET、HEAD 请求浏览器会自动跳转;非 GET、HEAD 请求浏览器不能自动跳转,需要用户确认。响应默认可缓存。
历史兼容坑:部分旧浏览器 POST 收到 301 后,跳转请求会错误转为 GET。
302 Found(临时移动)
资源临时变更 URI,未来地址还可能发生变化,后续请求依旧使用原地址。仅当 Cache-Control、Expires 头指定才会被缓存。非 GET、HEAD 请求不能自动跳转。
历史兼容坑:很多旧浏览器把 302 按照 303 逻辑处理,POST 跳转后变成 GET 请求。
303 See Other(查看其他位置)
请求处理结果在另一个 URI,客户端必须使用 GET 方法访问新地址。多用于 POST 提交表单之后跳转页面。303 响应禁止缓存,跳转之后的请求可以被缓存。
注意:HTTP/1.1 之前不少浏览器无法正确理解 303。需要兼容这些旧浏览器时,用 302 更稳妥——它们处理 302 的方式,接近规范要求的 303 行为。
304 Not Modified(未修改)
缓存协商专用状态码。对比 If-Modified-Since、If-None-Match,客户端本地缓存资源没有过期,服务器不返回资源正文,直接复用浏览器本地缓存。禁止携带响应体。
305 Use Proxy(使用代理)
请求资源必须通过响应 Location 指定的代理访问。出于安全问题,该状态码已经被废弃。
306(已废弃不再使用)
早期 HTTP/1.1 草案定义,现在保留占位,实际不使用。
307 Temporary Redirect(临时重定向)
资源临时迁移,后续请求继续使用原地址;只有缓存头指定才允许缓存。和 302 区别:跳转严格沿用原来的 HTTP 请求方法,POST 请求跳转依旧发 POST,不会改成 GET。
308 Permanent Redirect(永久重定向)
资源永久迁移至 Location 指定 URI。和 301 区别:跳转严格沿用原始请求方法,POST 跳转依旧发送 POST 请求。
4xx 客户端错误
4xx 代表客户端请求存在错误,服务器无法正常处理。除 HEAD 请求外,服务器应当返回实体说明错误原因。
如果客户端还在继续发送数据,服务端 TCP 栈需要做好处理,避免缓冲区残留数据干扰业务逻辑。
400 Bad Request(错误请求)
客户端请求存在问题,服务器解析失败。
常见原因:
- 请求语法错误
- JSON、表单参数格式错误
- 请求头畸形
- Cookie 损坏
- 人为构造的错误 HTTP 请求
401 Unauthorized(未授权)
语义实际代表未认证,不是未授权。需要客户端完成身份认证;响应携带 WWW-Authenticate 质询头。如果已经带上身份凭证还返回 401,说明凭证校验失败。
402 Payment Required(要求付费)
保留预留状态码,最初设想用于数字支付系统,目前没有通用标准;部分开放 API 用于调用额度超限提示。
403 Forbidden(禁止访问)
服务器理解请求,但是拒绝执行。服务器知道客户端是谁,身份认证也无法解决该错误,不要重复提交请求。服务器可以返回实体说明拒绝理由,也可以伪装成 404,隐藏资源是否存在。
常见场景:权限不足、IP 被拒绝、站点要求 HTTPS、客户端证书缺失或不被信任、证书过期或已吊销。
404 Not Found(未找到)
服务器找不到请求对应的资源。URL 拼写错误、资源已经删除、接口端点存在但是数据不存在都可以返回 404;服务器也可以用 404 代替 403,隐藏资源权限信息。
排查时可依次确认:
- URL 是否写错
- 资源是否已移动或删除
- 站点文档根目录配置是否正确
- Web 进程用户是否有目录读、执行权限
- 若目标是符号链接,服务器是否允许跟随
405 Method Not Allowed(方法禁用)
请求使用的 HTTP 方法,目标资源不支持。响应必须返回 Allow 头,列出该资源允许的 HTTP 方法。常见:接口只接受 POST,客户端发起 DELETE 请求。
406 Not Acceptable(不接受)
服务端内容协商之后,没有产出符合客户端 Accept 系列请求头要求的资源格式。可以返回实体列出可用资源选项。HEAD 请求禁止返回实体。
407 Proxy Authentication Required(需要代理授权)
和 401 类似,区别是身份认证需要在代理服务器完成,响应携带 Proxy-Authenticate 质询头。
408 Request Timeout(请求超时)
服务器等待客户端完整请求超时。服务器主动关闭空闲连接;浏览器预连接机制场景容易见到该状态码。部分服务器直接关闭 TCP 连接,不返回 408 报文。
409 Conflict(冲突)
请求和服务器当前资源状态产生冲突。典型场景:并发编辑同一份资源产生冲突。该状态适用于用户可以手动解决冲突,重新提交请求的业务。
410 Gone(已删除)
请求资源已经永久移除,没有转发地址。客户端应该删除本地缓存、删除指向该地址的链接。如果不能确定是否永久删除,使用 404。响应可以被缓存。
411 Length Required(需要有效长度)
服务器要求请求必须携带 Content-Length 请求头,但是客户端没有提供。补充正确 Content-Length 后可以重发请求。
412 Precondition Failed(前提条件失败)
请求头携带的预校验条件(If-Match、If-Unmodified-Since 等)服务器校验不通过。用于防止更新丢失。
413 Payload Too Large(请求实体过大)
请求提交的请求体大小超过服务器上限。服务器可以选择关闭连接,也可以返回 Retry-After 提示多久之后重试。
414 URI Too Long(请求的 URI 过长)
请求 URI 长度超出服务器解析上限。常见:GET 查询字符串拼接过多参数、重定向循环不断叠加 URL、利用超长 URL 做漏洞攻击。
415 Unsupported Media Type(不支持的媒体类型)
请求提交的请求体媒体类型,服务器不支持,拒绝处理该请求。
416 Range Not Satisfiable(请求范围不符合要求,RFC 7233)
请求头 Range 指定的分片范围全部超出资源实际大小,同时没有带上 If-Range。
417 Expectation Failed(未满足期望值)
服务器无法处理 Expect 请求头声明的预期。
418 I'm a teapot(我是一个茶壶,RFC 2324)
IETF 愚人节 RFC 定义的彩蛋状态码,现实业务服务器不需要实现;部分项目用作趣味彩蛋。
420 Enhance Your Calm(保持冷静)
非 RFC 标准。Twitter Search、Trends API 在客户端被限流时曾返回该码;现行通用限流多用 429。
421 Misdirected Request(错误定向请求,RFC 7540)
请求被发送给一台不能生成对应响应的服务器。
422 Unprocessable Entity(无法处理的实体,WebDAV;RFC 4918)
报文格式语法正确,但是业务语义校验错误,无法处理。比如 JSON 格式正确,但是字段业务规则校验失败。
423 Locked(锁定,WebDAV;RFC 4918)
访问的资源处于锁定状态。
424 Failed Dependency(依赖失败,WebDAV;RFC 4918)
本次请求的执行依赖上一个请求,上一个请求失败,导致本次请求失败。
425 Too Early(太早了)
服务器拒绝处理存在重放风险的过早请求,防止重放攻击。
426 Upgrade Required(需要升级,RFC 2817)
服务器拒绝当前协议处理请求;响应携带 Upgrade 头,告知客户端需要切换的协议版本。
428 Precondition Required(需要前提条件,RFC 6585)
源服务器要求请求必须是条件请求,用来防止更新丢失问题,避免客户端覆盖别人已经修改过的数据。
429 Too Many Requests(请求过多,RFC 6585)
限流,客户端短时间发送大量请求。可以返回 Retry-After 告知冷却时间。
431 Request Header Fields Too Large(请求头过大,RFC 6585)
HTTP 请求头整体大小超过服务器上限;缩小请求头之后可以重发请求。
451 Unavailable For Legal Reasons(由于法律原因无法使用)
资源因为法律审查、合规原因无法访问。
444
Nginx 扩展,服务器直接关闭连接,不返回任何响应内容。
450
Windows 家长控制系统拦截,非标准 RFC 状态码。
5xx 服务器错误
5xx 代表服务器内部处理发生异常;HEAD 之外的请求,服务器返回实体描述错误情况;状态码适用于全部 HTTP 请求方法。
500 Internal Server Error(内部服务器错误)
通用服务器异常,服务器遇到未知错误,无法完成请求。常见:代码异常、配置文件语法错误、依赖缺失。
501 Not Implemented(尚未实施)
服务器不支持该 HTTP 请求方法。规范强制 GET、HEAD 必须支持,不会返回 501。
502 Bad Gateway(错误网关)
网关、反向代理拿到后端上游服务器返回的无效响应。排查方向:后端服务是否正常、代理配置、代理与后端网络连通性、端口、socket 权限。
503 Service Unavailable(服务不可用)
服务器临时无法处理请求,原因:服务器维护、CPU 与内存过载。属于临时状态,响应可以携带友好提示页面;建议带上 Retry-After 头告知恢复时间;该响应一般不应该被浏览器缓存。
504 Gateway Timeout(网关超时)
网关、反向代理等待后端上游服务器响应超时。排查:后端接口执行耗时、服务器之间网络、代理超时配置。
505 HTTP Version Not Supported(HTTP 版本不受支持)
服务器不支持请求报文使用的 HTTP 协议版本。
506 Variant Also Negotiates(协商引起的异常,RFC 2295)
服务器内部配置错误,透明内容协商产生循环引用。
507 Insufficient Storage(存储不足,WebDAV;RFC 4918)
服务器存储空间不足,无法完成该请求。属于临时状态。
508 Loop Detected(循环检测,WebDAV;RFC 5842)
处理请求的时候检测到无限循环。
510 Not Extended(扩展不足,RFC 2774)
服务器需要客户端开启扩展,才能完成本次请求。
511 Network Authentication Required(网络身份验证要求,RFC 6585)
客户端需要完成网络层面身份认证。典型场景:WiFi 门户网页,需要登录上网。