计算机网络协议系列 - HTTP 协议篇:HTTP 响应状态码
- 1 min 计算机网络协议系列(三十六)
状态码概述
当目前为止,我们已经介绍完了 HTTP 请求报文起始行的所有元素,第一个是请求方法,第二个是标识请求资源的 URL(一般来说是相对于域名的相对 URL,Web 服务器会将其和请求首部里的 Host 字段组合拼接成完整 URL),第三个是客户端 HTTP 协议的版本,关于报文首部我们放到下一篇统一介绍,现在我们跳到响应报文的起始行,前面已经简单介绍过,响应报文的起始行也由三部分组成,分别是服务器 HTTP 协议的版本,响应状态码以及原因短语,HTTP 协议的版本我们已经讨论过,响应短语主要是响应状态码的可读版本,所以我们重点关注响应状态码。
状态码的职责是当客户端向服务器端发送请求时,描述返回的处理结果,借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误。
状态码由3位数字组成,按照首数字可以将响应分类如下:
RFC2616 上记录的 HTTP 状态码有 40 种,再加上 WebDAV(基于万维网的分布式创作和版本控制,RFC4918、5842)和附加 HTTP 状态码(RFC6585)等扩展,数量达60余种,但常用的大概只有14种。下面我们就常见的状态码进行介绍。
1XX:信息性状态码
信息性状态码日常很少见,主要有如下两个:
- 100:说明收到请求的初始部分,请客户端继续,比如客户端要发送一个请求实体给服务器,但想在发送之前查看下服务器是否会接收这个实体;
- 101:说明服务器正在根据客户端的指定,将协议切换成 Update 首部所列的协议。
2XX:成功状态码
2XX 的响应结果表明请求被服务器正常处理了。常见的 2XX 状态码如下所示:
- 200:表明从客户端发来的请求在服务器端被正常处理了;
- 201:用于创建服务器对象的请求(如 PUT 请求);
- 202:请求已被接收,但服务器还未对其执行任何动作;
- 203:表明实体部分包含的信息不是来自源端服务器,而是来自资源的一份副本;
- 204:该状态码代表服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分;
- 205:负责告知浏览器清除当前页面中的所有 HTML 表单元素;
- 206:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求,响应报文中由 Content-Range 指定范围的实体内容。
3XX:重定向状态码
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求,比如对请求进行重定向,常见的 3XX 状态码如下所示:
- 300:客户端请求一个实际指向多个资源的 URL 时返回这个状态码;
- 301:永久性重定向,该状态码表示请求的资源已经被分配了新的 URL,以后应使用资源现在所指的 URL;
- 302:临时性重定向,该状态码表示请求的资源已被分配了新的 URL,希望用户能使用新的 URL 访问,和 301 状态码类似,但 302 状态码代表的资源不是被永久移动,只是临时性质的;
- 303:该状态码表示由于请求对应的资源存在着另一个 URL,应使用 GET 方法定向获取请求的资源,303 状态码和 302 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点和 302 状态码有所区别;
- 304:该状态码表示客户端发送附带条件的请求(If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since)时,服务器端允许请求访问资源,但未满足条件的情况下,304 状态码返回时,不包含任何响应的主体部分,常用做客户端缓存。304 虽然被划分在 3XX 类别中,但是与重定向没有任何关系;
- 305:用来说明必须通过一个代理来访问资源,代理的位置由 Location 首部指定;
- 307:临时重定向,该状态码与 302 有着相同的含义,尽管 302 标准禁止 POST 变成 GET,但实际使用时大家都不遵守。307 会遵照浏览器标准,不会从 POST 变成 GET,但是对于处理响应时的行为,每种浏览器都有可能出现不同的情况。
注:当 301、302、303 响应状态码返回时,几乎所有浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。
4XX:客户端错误状态码
4XX 的响应结果表示客户端是发生错误的原因所在,常见的 4XX 状态码列举如下:
- 400:该状态码表示请求报文中存在语法错误,当错误发生时,需修改请求的内容后再次发送请求;
- 401:该状态码表示发送的请求需要有通过 HTTP 认证的认证信息,另外若之前已进行过1次请求,则表示用户认证失败;
- 402:该状态码暂时还未启用;
- 403:该状态码表明对请求资源的访问被服务器拒绝了,服务器端没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的主体部分对原因进行描述,这样用户就能看到了;
- 404:该状态码表明服务器上无法找到请求的资源,除此之外,也可以在服务器端拒绝请求且不想说明原因时使用;
- 405:发起的请求中带有请求 URL 所不支持的请求方法时返回该状态码,上一篇分享中我们已经提及;
- 406:客户端可以指定参数来说明它们愿意接收什么类型的实体,服务器没有与客户端可接受的 URL 相匹配的资源时,返回此状态码;407:与 401 状态码类似,但用于要求对资源进行认证的代理服务器;
- 408:客户端请求超时,服务器返回此状态码并关闭连接;
- 409:说明请求可能在资源上引发冲突时返回此状态码;
- 410:与 404 类似,只是服务器曾经拥有过此资源,现在被移除了;
- 411:服务器要求请求报文中包含 Content-Length 首部时使用;
- 412:客户端发起条件请求,但其中一个条件失败时使用;
- 413:客户端发送的实体主体部分超过服务器处理的上限,一般上传大文件时会出现这种情况;
- 414:客户端发送请求中的请求 URL 超过服务器能处理的长度上限,返回此状态码;
- 415:服务器无法理解或无法支持客户端所发送实体的内容类型。
5XX:服务器错误状态码
5XX 的响应结果表明服务器本身发生错误,常见的 5XX 状态码如下所示:
- 500:该状态码表明服务器端在执行请求时发生了错误,也可能是 Web 应用程序存在的 bug 或某些临时的故障;
- 501:客户端发起的请求超出服务器能力的范围;
- 502:作为代理或网关使用的服务器从请求响应链的下一条链路上收到了一条伪响应时返回此状态码;
- 503:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求,如果事先得知解除以上状况需要的时间,最好写入 Retry-After 首部字段再返回给客户端;
- 504:与状态码 408 相似,这是这里的响应来自网关或代理,它们在等待另一个服务器对其请求进行响应的时候超时了,比如 php-fpm 故障或没有启动,通过 nginx 访问应用的时候会返回此状态码;
- 505:服务器收到的请求使用了它无法支持的协议版本时,使用此状态码。