HTTP请求响应的状态码解析

HTTP 响应背景知识

HTTP 响应状态代码表示特定的 HTTP 请求是否已成功完成,如下图所示,共包含五类,即:

HTTP响应状态码

以下内容,和 MDN 上的内容有很多重复的地方,算是 MDN 状态码 的精校修订版本,参考的资源,大部分是 各个版本 RFC 的原文以及中英文的 MDN 和相关博客。

信息响应

100 Continue

100是临时响应,此临时响应表明到目前为止请求一切正常,客户端应该继续请求,如果请求已经完成则忽略它。

101 Switching Protocol

该状态码是用来响应客户端切换协议的请求的,切换的协议由客户端指示,只能切换到更高级的协议。

102 Processing (WebDAV)

此代码表示服务器已收到并正在处理该请求,但尚未提供可用的响应。 WebDAV:WebDAV(Web分布式创作和版本控制)是一种HTTP扩展,允许Web开发人员从客户端远程更新其内容。

103 Early Hints

此状态代码主要用于与链接头(Link Header)一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源

成功响应

200 OK

请求成功。成功的含义对于不同HTTP方法略有差异:

201 Created

请求已成功,并且已创建新资源。这通常是在POST请求之后或在某些PUT请求之后发送的响应。 原始服务器必须在返回201状态代码之前创建资源。

202 Accepted

请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,它适用于其他进程或服务器处理请求或批处理的情况。

203 Non-Authoritative Information

服务器已成功处理了请求,但是实体标头中返回的元信息不是源服务器可用的权威集,而是从本地或第三方副本收集的。 除此条件外,应首选200 OK响应而不是此响应。。

204 No Content

服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。 此响应主要用于允许在不导致更改用户代理的活动文档视图的情况下进行操作的输入,尽管任何新的或更新的元信息应该应用于当前在用户代理的活动视图中的文档。
204响应绝不能包含消息体,因此总是在头字段之后的第一个空行终止。

205 Reset Content

服务器成功处理了请求,且没有返回任何内容。但与204响应不同,返回此状态码的响应要求请求者重置文档视图
该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含消息体,且总是在头字段之后的第一个空行终止。

206 Partial Content

服务器已完成对资源的部分GET请求。 请求必须包含一个指示所需范围的Range头字段,并且可能包含一个If-Range头字段来作为请求条件。 使用此响应代码是因为客户端发送的范围标题将下载分离为多个流。HTTP 下载工具都使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载
响应必须包括以下标头字段:

207 Multi-Status

RFC 2518扩展的状态码,代表之后的消息体确实是XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码

208 Already Reported

RFC 5842扩展的状态码,在 DAV:propstat响应元素中使用,以避免重复枚举多个绑定到同一集合的内部成员
对于每个绑定到请求范围内的集合,只有一个将报告200状态,而后续DAV:所有其他绑定的响应元素将使用208状态,并且不包括其后代的DAV:响应元素。

226 IM Used

RFC 3229 扩展的状态码,服务器已完成对资源的GET请求,并且响应是应用于当前实例的一个或多个实例操作的结果的表示。 实际的当前实例可能不可用,除非将此响应与其他先前或将来的响应相结合,适用于特定的实例操作。

重定向信息

300 Multiple Choice

被请求的资源有一多个可供选择的响应信息,每个都有自己特定的地址和浏览器驱动的协议信息。用户或者浏览器可以选择其中一个进行重定向。

301 Moved Permanently

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。一般情况下,这个响应也是可缓存的。用户代理不得更改所使用的HTTP方法。

302 Found

此响应代码表示所请求资源的URI已临时更改。 将来可能会对URI进行新的更改。 因此,客户端在将来的请求中应该使用相同的URI。一般不缓存,只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

303 See Other

服务器发送此响应以指示客户端使用GET请求在另一个URI处获取所请求的资源。此方法存在是允许由脚本激活的 POST 请求输出重定向到一个新的资源。

304 Not Modified

这用于缓存目的。 它告诉客户端响应未被修改,因此客户端可以继续使用相同的缓存版本的响应
304 响应也被禁止包含消息体,且总是在头字段之后的第一个空行终止。

305 Use Proxy

在HTTP规范的先前版本中定义,以表示访问所请求的响应必须使用代理。由于有关代理的配置存在安全性问题,305状态码已被弃用

306 (Unused)

306响应代码不再被使用,它只是当前保留的。 它曾在HTTP 1.1规范之前的版本中被使用。

307 Temporary Redirect

服务器发送此响应以指示客户端使用与先前请求中相同的方法在另一个URI处获取所请求的资源。 这与 302 Found HTTP响应代码具有相同的语义,但用户代理不得更改所使用的HTTP方法,例如,如果在第一个请求中使用了POST,则在第二个请求中必须也使用POST 方法。同样,响应只有在 Cache-Control 或 Expires 头字段指定的情况下,才能被缓存.

308 Permanent Redirect

RFC 7538 扩展的状态码,永久重定向,308状态代码指示已为目标资源分配了新的永久URI,并且此资源将来的任何引用都应使用其中一个附带的URI。 具有链接编辑功能的客户端应尽可能自动将对原有有效请求URI 的引用重新链接到服务器响应的一个或多个新引用中。此状态码的响应默认被缓存。并且与 301 响应一样,不允许更换 HTTP 方法

客户端错误响应

400 Bad Request

语义有误或者请求参数有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。

401 Unauthorized

当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端必须对自身进行身份验证才能获得请求的响应。

402 Payment Required

此响应码保留以便将来使用,该响应码最初被设计用到数字支付相关的功能,但是未被使用。

403 Forbidden

服务器已经理解请求,但是拒绝执行它。客户端没有对内容的访问权限,即客户端是未经授权的,因此服务器拒绝提供对应的响应。 与401不同,服务器知道客户端的身份。

404 Not Found

服务器找不到请求的资源。 在浏览器中,这意味着无法识别URL。 在API中,这也意味着端点有效但资源本身不存在。 服务器也可以发送此响应而不是403来隐藏来自未授权客户端的资源的存在。
404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下

405 Method Not Allowed

405状态码表示请求行中指定的请求方法不能被用于请求相应的资源。客户端的请求方法被禁止。该响应必须返回一个 Allow 头信息用以表示出当前资源能够接受的请求方法的列表。405响应默认可被缓存。由于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。

406 Not Acceptable

请求的资源内容特性无法满足请求头中的条件,因而无法生成响应实体。

407 Proxy Authentication Required

与401响应类似当前请求需要用户验证,不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。

408 Request Timeout

请求超时客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。即使没有客户端先前的任何请求,此响应也会由某些服务器在空闲连接上发送。 这意味着服务器想要关闭这个未使用的连接。

409 Conflict

由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在 “用户被认为能够解决冲突,并且会重新提交新的请求” 这样的情况下。该响应应当包含足够的信息以便用户发现冲突的源头。

410 Gone

当前请求的内容已从服务器中永久删除时,将发送此响应,没有转发地址,并且被认为是永久的。客户端应该删除其缓存和资源链接。
如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用 404 状态码。除非额外说明,否则这个响应是可缓存的。

411 Length Required

服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。

412 Precondition Failed

应用于请求的头字段中有先决条件,服务器在验证请求的头字段中给出的先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。

413 Payload Too Large

服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求 或者 服务器也可返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。

414 URI Too Long

请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。在那些表单内容比较多的接口中,本应使用POST方法的表单提交变成了GET方法时可能会出现这种情况。

415 Unsupported Media Type

服务器不支持所请求数据的资源格式,因此服务器拒绝该请求。

416 Range Not Satisfiable

无法满足请求中Range头字段指定的范围,该范围可能超出目标URI数据的大小。

417 Expectation Failed

此响应代码表示服务器无法满足Expect请求标头字段指示的期望

418 I’m a teapot

服务器拒绝尝试 HTCPCP 协议,恶搞协议,程序员的恶趣味。

421 Misdirected Request

该请求针对的是无法生成响应的服务器。 这可以由未配置为针对请求URI中包含的方案和权限的组合生成响应的服务器发送。

422 Unprocessable Entity

请求格式正确,但由于语义错误而无法遵循。客户端不应在未经修改的情况下重复此请求。

423 Locked

正在访问的资源被锁定

424 Failed Dependency

由于先前的请求失败,这次的请求失败。

425 Too Early

425状态代码表示服务器不愿意冒着风险去处理可能重播的请求

426 Upgrade Required

服务器拒绝使用当前协议执行请求,但可能愿意在客户端升级到其他协议后执行此操作。服务器在426响应中发送 Upgrade 标头以指示所需的协议。

428 Precondition Required

服务器要求该请求是有条件的。 旨在防止“lost update”问题,即客户端获取资源状态,修改该状态并将其返回服务器,如果同时第三方修改服务器上的状态,就会导致冲突。

429 Too Many Requests

用户在指定的时间内发送了太多请求,“限制请求频率”。

431 Request Header Fields Too Large

服务器不愿意处理请求,因为它的请求头字段太大(Request Header Fields Too Large)。 在减小请求头字段的大小之后,可以重新提交请求。

用户请求非法资源,例如在请求那些被政府审查的网页时,可能返回该状态码。

服务器错误响应

500 Internal Server Error

服务器遇到了不知道如何处理的情况

501 Not Implemented

请求方法不被服务器支持且无法被处理

502 Bad Gateway

502响应代码,意味着服务器在作为网关获取处理请求所需的响应时,得到的响应无效

503 Service Unavailable

服务器尚未准备好处理请求。 常见原因是服务器因维护而停机或过载。与此响应一起,应发送解释问题的页面。 此响应应用于临时条件,并且HTTP标头应尽可能包含恢复服务之前的估计时间(Retry-After)。

504 Gateway Timeout

服务器充当网关并且无法及时获得响应时,会给出此错误响应。

505 HTTP Version Not Supported

服务器不支持请求中使用的HTTP协议版本。

506 Variant Also Negotiates

506状态代码出自RFC 2295,表示服务器内部配置错误:所选择的变体资源被配置为参与透明内容协商(transparent content negotiation) 导致了循环引用,因此不是协商过程中的正确终点。

507 Insufficient Storage

存储空间不足,507状态代码表示无法对资源执行该方法,因为服务器无法存储成功完成请求所需的内容。这种情况被认为是暂时的,如果收到此状态代码的请求是用户操作的结果,则在单独的用户操作请求之前不得重复该请求。

508 Loop Detected

服务器在处理请求时检测到无限循环,终止操作,请求失败。

510 Not Extended

发送的请求未满足访问资源的策略请求需要进一步扩展才可得到实现,服务器会回复客户端发出扩展请求所需的所有信息。

511 Network Authentication Required

511状态代码表示客户端需要进行身份验证才能获得网络访问权限。响应应该包含指向允许用户提交凭据的资源的链接

有点儿意思

在学习这个状态码的过程中,顺手帮 MDN 社区添加了几条修订记录,因为英文版的状态码有最新的更新,而中文版的还没有更新,这也算看中英文对照资料的一个好处吧。并且在这个过程中,笔者发现英文版的MDN文档也存在一些错误,必须要查阅RFC标准源文件才能确定。 如果不算Github,这应该算是参与社区建设的第一步,但肯定不是最后一步。留下一个修订主页 为以后做准备吧。

最后再来一张全家福吧:

HTTP所有状态码整理版本

参考资料