http 状态码(http status code)是一个表示服务器响应状态的 3 位整数代码。比如当服务器收到客户端的某个请求后,服务器会对客户端做出响应,响应中会使用一个数字形式的代码来表示当前响应的状态,这个代码就是 http 状态码。
状态码使用第一个数字表示响应的类别,一共五种,分别使用 1~5 来表示,状态码的后两位则没有特殊的含义。http 状态码的类别及说明如下表所示。
分类 | 分类描述 |
---|---|
1xx | 信息,表示服务器收到了请求,并且该请求还没有完成,需要请求者继续执行 |
2xx | 成功,表示请求被成功接收并处理 |
3xx | 重定向,表示需要进一步的操作才能完成请求 |
4xx | 客户端错误,表示该请求无法完成或包含语法错误 |
5xx | 服务器错误,表示服务器在处理请求的过程中发生了错误 |
下面来详细介绍一下 http 中的状态码。
1. 消息:1xx
1xx 类型的状态码代表客户端的请求已被服务器接受,但还需要继续处理。这类响应是临时响应,只包含响应行和某些可选的响应头信息,并以空行结束。由于 http/1.0 协议中没有定义 1xx 这一类型的状态码,所以除非在特定的条件下,否则服务器不会向客户端发送 1xx 类型的响应。1xx 类型状态码的具体说明如下表所示:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | continue | 表示服务端仅收到了一部分请求,客户端应继续该请求 |
101 | switching protocols | 表示服务端已经根据客户端的请求切换了协议版本,注意:只能向更高级的协议版本切换,例如,切换到 http 的新版本协议 |
102 | processing | 表示服务端已收到并且正在处理这个请求,但暂无响应 |
103 | early hints | 表示允许服务端在主响应头之前先发送部分响应头,以达到预加载文件的目的 |
2. 成功:2xx
2xx 类型的状态码代表客户端的请求已成功被服务端接收,并成功处理了这个请求。2xx 类型状态码的具体说明如下表所示:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
200 | ok | 表示请求成功 |
201 | created | 表示请求成功并创建了新的资源 |
202 | accepted | 表示该请求正在进行处理,但尚未处理完成 |
203 | non-authoritative information | 表示请求成功。但返回的 meta 信息不在原始的服务器,而是一个副本 |
204 | no content | 表示请求成功,但不需要返回任何响应体 |
205 | reset content | 表示请求成功,但没有返回任何响应体。与状态码 204 不同的是,此状态码告诉客户端应立即重置发送此请求的文档视图。比如在用户提交表单后,立即重置表单,以便用再次输入 |
206 | partial content | 表示服务端成功处理了部分 get 请求,像迅雷这类的 http 下载工具就是使用此类响应实现断点续传或者分段下载的 |
207 | multi-status | 由 webdav(rfc 2518) 扩展的状态码,代表之后的响应体将是一个 xml 消息,并且可能依照之前子请求数量的不同,包含一系列**的响应代码 |
3. 重定向:3xx
3xx 类型的状态码代表需要客户端采取进一步的操作才能完成请求。通常这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 location 域中指明。
当且仅当后续的请求所使用的方法是 get 或者 head 时,用户浏览器才可以在没有用户介入的情况下自动提交所需要的后续请求。客户端应当自动监测并避免无限循环的重定向(例如:a->a,或者 a->b->c->a),因为这会导致服务器和客户端资源的消耗。按照 http/1.0 版协议的规范,浏览器重定向得次数不得超过 5 次。
3xx 类型状态码的具体说明如下表所示:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
300 | multiple choices | 表示该请求有多种可能的响应,客户端需要选择其中的一个进行重定向 |
301 | moved permanently | 表示请求的资源已永久移动到新的 url,响应中会包含新的 url,浏览器会自动重定向到新的 url,今后任何对该资源的请求都应该使用新的 url |
302 | found | 表示请求的资源被临时移动到新的 url,与 301 不同,被请求的资源只是临时被移动,后续对该资源的请求还可以使用原 url |
303 | see other | 表示对当前请求的响应可以在另一个 url 上找到,而且客户端应当采用 get 的方式访问那个资源 |
304 | not modified | 表示所请求的资源(自上次访问)并没有改变时,服务器会返回此状态码,但响应中不会包含响应体,因此客户端可以使用上次请求缓存的资源 |
305 | use proxy | 表示所请求的资源必须通过指定的代理才能访问 |
306 | unused | 在最新版的规范中,该状态码已经被弃用 |
307 | temporary redirect | 与 302 类似,表示所请求的资源需要临时从不同的 url 响应 |
4. 请求错误:4xx
4xx 类型的状态码代表了客户端可能发生了错误,导致服务器无法完成响应,服务器就会返回一个解释当前错误状况的响应体。这一类状态码适用于任何请求方法(head 请求除外),客户端(浏览器)会自动显示出响应中的响应体,也就是我们常说的错误信息。
4xx 类型状态码的具体说明如下表所示:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
400 | bad request | 客户端请求有语法错误,服务器无法理解 |
401 | unauthorized | 当前请求需要用户的身份认证 |
402 | payment required | 该状态码是为了将来可能的需求而预留的 |
403 | forbidden | 服务器理解客户端的请求,但是拒绝执行此请求 |
404 | not found | 请求失败,服务器无法找到客户端所请求的资源 |
405 | method not allowed | 客户端请求行中使用的请求方法被服务器禁用 |
406 | not acceptable | 服务端响应的资源类型与客户端请求头中要求的资源类型不符,客户端无法解析,简单来讲就是,服务器返回的数据客户端解析不了 |
407 | proxy authentication required | 与 401 响应类似,只不过客户端必须在代理服务器上进行身份验证 |
408 | request time-out | 请求超时,服务器无法在规定时间内对客户端进行响应 |
409 | conflict | 由于客户端请求中要执行的操作与服务器中被请求资源的当前状态存在冲突,导致请求无法完成,通常发生在 put 请求中 |
410 | gone | 客户端请求的资源已经不存在,不同于 404,当资源以前有,但现在被永久删除的情况下可以使用 410 状态码 |
411 | length required | 服务器无法处理客户端发送的不带 content-length 的请求信息 |
412 | precondition failed | 服务器在验证客户端请求头中的字段时,有一个或多个不能满足 |
413 | request entity too large | 客户端请求中,提交的数据大小超过了服务器允许的范围,服务器拒绝处理当前请求 |
414 | request-uri too large | 请求的 uri 长度超过了服务器能够处理的长度,因此服务器拒绝处理该请求 |
415 | unsupported media type | 服务器无法处理客户端请求中附带的媒体格式 |
416 | requested range not satisfiable | 如果请求中包含了 range 头部字段,并且 range 中指定的数据范围与当前资源的可用范围不符,同时请求中又没有定义 if-range 头部字段,那么服务器就会返回 416 状态码 |
417 | expectation failed | 服务器无法满足请求头中 expect 头部字段的信息 |
418 | i'm a teapot | 状态码 418 是 ietf 在 1998 年愚人节发布的一个玩笑 rfc |
421 | misdirected request | 当客户端的请求过多,超过了服务器能过处理的范围时,返回此状态码 |
422 | unprocessable entity | 请求格式正确,但是由于含有语义错误,所以服务器无法响应 |
423 | locked | 当前资源被锁定 |
424 | failed dependency | 由于之前的某个请求发生的错误,导致当前请求失败 |
425 | too early | 该请求可能会被“重放”,从而造成潜在的重放攻击,服务器不愿冒险,所以拒绝处理该请求 |
426 | upgrade required | 客户端应当切换到 tls/1.0 协议 |
449 | retry with | 由微软扩展,代表请求应当在执行完某些操作后进行重试 |
451 | unavailable for legal reasons | 该请求因法律原因不可用 |
5. 服务器错误:5xx
5xx 类型的状态码代表了服务器在处理请求的过程中出现错误或者发生异常(这些错误或异常是服务器本身造成的,与请求无关),也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理,此时服务器会在响应体中返回一个描述当前错误的解释信息,客户端会直接向用户展示这个响应体。5xx 类型的状态码适用于任何 http 方法。
5xx 类型状态码的具体说明如下表所示:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
500 | internal server error | 服务器内部错误,无法完成请求 |
501 | not implemented | 服务器不支持请求所需要的某个功能,无法完成请求 |
502 | bad gateway | 网关或者代理服务器在尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | service unavailable | 由于服务器维护或者过载,导致当前请求无法处理 |
504 | gateway time-out | 充当网关或代理服务器时,未能及时收到远程服务器的响应 |
505 | http version not supported | 服务器不支持请求中 http 协议的版本,无法完成处理 |
506 | variant also negotiates | 服务器存在内部配置错误 |
507 | insufficient storage | 服务器无法存储完成请求所必须的内容 |
509 | bandwidth limit exceeded | 服务器达到带宽限制 |
510 | not extended | 不能满足获取资源所需要的要求,还需要进一步扩展 |