【吐血整理】全网最完整的HTTP状态码整理,再也不怕被面试官问常见的状态码

407 阅读10分钟

完整版HTTP状态码参考

对于HTTP状态码的整理大多是以1xx~5xx这样的顺序,本文打破陈规,从5xx到1xx进行展示。

简介

多数情况下,5xx的状态码会更加常见,带来的影响也更加严重。其中像502(Bad Gateway)、503(Service Unavailable)、504(Gateway Timeout)和500(Internal Server Error)这4种情况尤为常见,其次就是4xx,不过多数体验良好的网站大多会处理掉类似404这样的错误,转而展示相对友好的“页面走丢”网页。而3xx的状态码一般不会直接展示在网页上,因为其本质作用是通知客户端进行资源请求的重定向,所以大多会直接进行隐式执行。比如301一般用于网站域名更换的新地址自动跳转;302会在用户浏览需要登录才能访问的网页时自动跳转到登录页;304则会在浏览器访问已经缓存过的资源时,避免重新请求,转而直接读取本地缓存

常见状态码

5xx(服务器错误)

  • 500:服务器未知错误
  • 502:服务器作为网关,应该得到处理该请求的响应,但得到错误响应
  • 503:服务器因维护或重载而停机
  • 504:服务器作为网关,不能及时得到响应

4xx(客户端错误)

  • 400:语义有误,当前请求无法被服务器理解(除非进行修改,否则客户端不应该重复提交这个请求)/请求参数有误
  • 401:当前请求需要用户验证
  • 403:服务器已经理解请求,但拒绝执行
  • 404:请求的资源未被在服务器上发现
  • 405:请求方法不能被用于请求响应的资源(PUT/DELETE会对服务器资源进行写操作,所以大部分网页服务器默认不允许PUT/DELETE请求)
  • 410:被请求的资源在服务器已不可用,且无已知的转发地址
  • 411:服务器拒绝在没有定义Content-Length头的情况下接受请求
  • 413:服务器拒绝处理当前请求,因为请求提交的实体数据大小超过服务器愿意或者能够处理的范围
  • 414:请求的URI长度超过服务器能解释的长度(比如应该使用POST的表单提交变成了GET方法,导致Query String过长)
  • 416:请求中包含Range请求头,且Range中指定的任何数据范围与当前资源的可用范围不重合,同时又没定义If-Range请求头
  • 426:服务器拒绝使用当前协议执行请求,但可能在升级到其他协议后愿意接受,服务器会在响应中发送Upgrade头以指示所需协议
  • 429:用户在给定时间内发送了太多请求(限制请求速率)

3xx(重定向)

  • 301:资源已永久移动到新位置
  • 302:请求的资源现在临时从不同的URI响应请求(一些旧客户端会错误地将请求方法转换为GET)
  • 304:客户端发送了一个带条件的GET请求且请求已被允许,而文档内容自上次访问以来或根据请求的条件并未改变(响应禁止包含消息体,始终以消息后头后的第一个空行结束)
  • 307:临时重定向,同302,但当发送重定向请求时,确保请求方法和消息主体不发生变化
  • 308:永久重定向,同301,但用户代理不能更改所使用的的HTTP方法

2xx(成功响应)

  • 200:请求成功,成功的含义取决于HTTP方法
  • 204:服务器已成功处理请求,但不需要返回任何实体内容,并且希望返回更新了的元信息(禁止返回任何消息体,始终以消息头后的第一个空行结尾)
  • 205:服务器已成功处理请求,且没返回任何内容,要求请求者重置文档视图(主要用于接收用户输入后,立即重置表单)
  • 206:服务器已成功处理部分GET请求(例如断点续传或将大文档分解为多个下载段同时下载,请求必须包含Range头信息来指示客户端希望得到的内容范围,并且可能包含If-Range作为请求条件)

1xx(信息响应)

  • 100:当前所有内容都是可行的,客户端应该继续请求
  • 101:响应客户端的Upgrade标头发送的,并且指示服务器也正在切换的协议
  • 102:服务器已收到并正在处理该请求,但没有响应可用

不常见状态码

5xx

  • 501:HTTP请求方法不被服务器支持且无法处理(GET和POST要求服务器支持,不会返回此码)
  • 505:服务器不支持请求中使用的HTTP协议版本
  • 506:服务器有内部配置错误(对请求的透明内容协商导致循环引用)
  • 507:服务器有内部配置错误(所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点)
  • 508:服务器在处理请求时检测到无限循环
  • 510:客户端需要对请求进一步拓展,服务器才能实现它(服务器会回复客户端发出拓展请求所需的所有信息)
  • 511:指示客户端需要进行身份验证才能获得网络访问权限

4xx

  • 402:保留状态码,最初目的用于数字支付系统,但并未使用
  • 406:请求资源的内容特性无法满足请求头中的条件,因此无法生成响应实体
  • 407:客户端必须在代理服务器上进行身份验证
  • 408:请求超时(客户端没有在服务器预备等待的时间内完成请求的发送)
  • 409:和被请求资源的当前状态存在冲突,导致请求无法完成
  • 412:服务器在验证在请求头字段中给出先决条件时,没能满足其中的一个或多个
  • 415:对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器所支持的格式
  • 417:服务器无法满足Expect请求标头字段指示的期望值
  • 418:I'm a teapot
  • 421:无法产生响应的服务器
  • 422:请求格式良好,但由于语义错误而无法遵循
  • 423:正在访问的资源被锁定
  • 424:由于先前的请求失败,所以这次请求失败
  • 425:服务器不愿冒着风险去处理可能重播的请求
  • 428:原始服务器要求该请求是有条件的
  • 431:服务器不愿处理请求,因为请求头字段太大
  • 451:用户请求非法资源(例如由政府审查的网页)

3xx

  • 300:被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能自行选择一个首选的地址进行重定向
  • 303:对应当前请求的响应可以在另一个URI上被找到,且客户端应当采用GET方式访问那个资源(主要为了允许由脚本激活的POST请求输出重定向到一个新的资源)
  • 305:资源必须通过指定代理才能访问
  • 306:未使用,新版协议已不再被使用

2xx

  • 201:请求已成功,并因此创建了新的资源(通常在POST,或某些PUT请求后返回)
  • 202:请求已接收到,但还未响应,没有结果(意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或批处理)
  • 203:服务器已成功处理请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或第三方的拷贝
  • 207:代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码
  • 208:DAV中使用,propstat响应元素以避免重复枚举多个绑定的内部成员到同一个集合
  • 226:服务器已经完成了对资源的GET请求,且响应是对当前实例应用的一个或多个实例操作结果的表示

1xx

  • 103:主要与Link链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源

状态码之间的关联性挖掘

206和416(部分资源)

利用206状态码进行断点续传实现,如果声明的Range发生错误并且没有使用If-Range进行预检,则会发生416

301和308、302和307(重定向)

308是对301的增强,307是对302的增强,都为了重定向时保证请求方法和消息主体不被改变

502和504(网关相关)

这两个都是服务器作为网关时响应的状态码,502是网关明确拿到了服务器错误的响应,504是在等待服务器的响应时发生了超时

101和426(协议升级)

101和426都用于协议升级,即当前的HTTP协议已经不符合实际的需求,比如使用websocket会用到Upgrade头进行协议升级

305和407(代理相关)

这两个状态码都和代理有关,305表示资源必须经过代理才可以访问,因此会发起重定向,407表示需要经过代理进行身份验证

408和504(超时相关)

408表示客户端在请求服务端时,客户端的请求相对于服务端的接收时间发生了超时,504表示网关服务器在等待服务器响应时发生了超时

冷知识

418

418表示“我是一个茶壶,拒绝冲泡咖啡”,表示客户端让服务端做了不该做的事。这是一次愚人节的恶搞协议,参见恶搞RFC

示例

参考官方文档