Appearance
HTTP的状态码是什么
状态码是HTTP报文的内容之一,早期的HTTP版本(0.9)中并没有状态码这一个定义,所以在实际的请求过程中,客户端很难知道这次请求服务器是否成功处理,或者如果发生错误后,错误的原因是什么?到了HTTP/1.x后,引入了状态码的概念,用来表示请求过程中发生的状态。状态码是服务器输出的,客户端常常根据状态码做出判断进而作为UI或者软件逻辑条件向下运行。使用状态码应该遵守规范,错误的使用将导致意外的结果。
状态码对客户端的运行策略有着很重要的影响,正确的使用状态码有助于不同客户端的优化,如在浏览器中,可以使用状态码控制缓存。 状态码由三位数字组成,每个状态码表示不同的处理结果。HTTP状态码主要分为五类,分别以不同的数字开头,每类状态码具有特定的含义。
常见的状态码
通常,我们常常接触的状态码分为五类,在这五类状态码中常常使用的并不多,一般来说下面的状态码出现频率是最高的,也是必须记住的。我们可以将不同类别的状态码类型分类为下面的格式:
- 1xx 信息响应类
- 2xx 成功响应类
- 3xx 重定向响应类
- 4xx 客户端错误响应类
- 5xx 服务器错误响应类
其中最常见的状态码含义在下方:
状态码 | 类别 | 含义 |
---|---|---|
100 | 信息响应 | Continue:服务器收到了请求的初始部分,客户端应该继续发送请求 |
101 | 信息响应 | Switching Protocols:服务器同意切换协议,通常是在升级到WebSocket时使用 |
200 | 成功响应 | OK:请求成功,服务器返回了请求的资源 |
201 | 成功响应 | Created:请求已成功处理,并创建了新的资源 |
204 | 成功响应 | No Content:请求成功,但没有返回任何内容,常常用于浏览器缓存,当返回204时,告知浏览器代表可以使用缓存的文件 |
205 | 成功响应 | Reset Content:请求成功,但响应中不包含任何内容,要求用户代理重置文档视图 |
301 | 重定向 | Moved Permanently:请求的资源已永久移动到新的位置 |
302 | 重定向 | Found:请求的资源临时移动到了新的位置 |
303 | 重定向 | See Other:请求的资源可以在另一个URI下找到,应该使用GET方法获取 |
304 | 重定向 | Not Modified:资源未修改,可以使用缓存的版本 |
307 | 重定向 | Temporary Redirect:请求的资源临时移动到了另一个URI |
400 | 客户端错误 | Bad Request:服务器无法理解请求的格式 |
401 | 客户端错误 | Unauthorized:请求需要用户认证 |
403 | 客户端错误 | Forbidden:服务器理解请求,但拒绝执行它 |
404 | 客户端错误 | Not Found:服务器找不到请求的资源 |
405 | 客户端错误 | Method Not Allowed:请求的方法不允许用于请求的资源 |
500 | 服务器错误 | Internal Server Error:服务器遇到了一个未曾预料的状况,无法完成请求 |
501 | 服务器错误 | Not Implemented:服务器不支持实现请求所需的功能 |
502 | 服务器错误 | Bad Gateway:作为网关或代理的服务器,从上游服务器收到了一个无效的响应 |
503 | 服务器错误 | Service Unavailable:服务器目前无法处理请求,通常是服务器过载或维护 |
504 | 服务器错误 | Gateway Timeout:作为网关或代理的服务器,未及时从上游服务器收到响应 |
这些常见的状态码在浏览器中绝大多数的版本都能兼容处理,但是不同浏览器和同一浏览器不同版本间都有很大兼容性差异。有关于这些差异,我们会在后续的浏览器兼容性章节中详细介绍。或者您可以在网上搜索有关最新的兼容性支持提醒。
对于更多的状态码含义解释和应用方法,您可以查看完整的HTTP状态码说明
IIS的差异
微软互联网信息服务 (Microsoft Internet Information Services)有时会使用额外的十进制子代码来获取更多具体信息,但是这些子代码仅出现在响应有效内容和文档中,而不是代替实际的HTTP状态代码。
可以说IIS存在对状态码的拓展如400.1、400.2,但并不是所有服务器都支持这样的状态码定义,有关于IIS状态码的定义,可以参考这里。
缓存警告代码(已过时)
RFC 7234中规定了以下与缓存相关的警告代码。与上面的其他状态代码不同,这些代码不是作为 HTTP 协议中的响应状态发送的,而是作为“警告”HTTP 标头的一部分发送的。
由于此“警告”标头通常既不是由服务器发送的,也不是由客户端确认的,因此 HTTP 工作组于 2022 年使用RFC 9111废弃了此标头及其代码。
110 响应已过时 缓存提供的响应已过时(内容的年龄超过了 Cache-Control 标头设置的最大年龄或启发式选择的有效期)。
111 重新验证失败 由于无法到达原始服务器,缓存无法验证响应。
112 断开操作 该缓存有意与网络的其余部分断开连接。
113 启发式到期 缓存启发式地选择大于 24 小时的新鲜度寿命,并且响应的年龄也大于 24 小时。
199 其他警告 任意、非特定的警告。警告文本可能会被记录或呈现给用户。
214 应用转换 如果代理对表示应用任何转换,例如更改内容编码、媒体类型等,则由代理添加。
299 其他持续警告 与 199 相同,但表示持续警告。
拓展定义
HTTP状态码是有使用规范的,但不代表无法拓展代码。有时候实际的业务中会需要更多的代码,并且客户端并不是浏览器时,可以自己定义不同的场景下的状态码告知客户端处理。但需要注意使用这五类状态码进行拓展。如负载均衡时,使用了下面的代码在不同的节点中进行交互处理。
460 客户端在空闲超时期限结束之前关闭了与负载均衡器的连接。通常,客户端超时时间早于弹性负载均衡器的超时时间。
463 负载均衡器收到了包含超过 30 个 IP 地址的 X-Forwarded-For 请求标头。
464 客户端和源服务器之间的协议版本不兼容。