前端基础:HTTP 状态码详解
HTTP 状态码详解
1xx(信息类):表示接收到请求并继续处理
100 客户端应当继续发送请求。这个临时响应是用来通知客户端他的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
101 服务器已经理解了客户端的请求,并将通过upgrade消息头通知客户端采用不同的协议来完成这个请求。在发送这个响应最后的空行后,服务器将会切换到在upgrade消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取此类措施。例如,切换到新的HTTP版本比旧版本更有优势,或者切换到一个实时同步的协议以传送利用此类特性的资源。
2xx(相应成功):标识动作被成功接收、理解和处理
200 请求已经成功,请求所希望的响应头或数据体将随此响应返回。
201 请求已经被实现,且又一个新的资源已经以据请求的需要而建立,且其URI已经随Location头信息返回。如果需要的资源无法及时建立的话,应当返回"202 Accepted"。
202 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。返回202状态码响应的目的是允许服务器接受其他过程的请求(例如,某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。
203 服务器已经成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当亲的信息可能是原始版本的子集或超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
204 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,泽应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何实体,因此它始终以消息头后的第一个空行结尾。
205 服务器成功处理了请求,且没有任何返回内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 服务器已经成功处理了部分GET请求。类似于FlashGet或迅雷这类HTTP下载工具都是使用此类响应实现断点续传或将一个大文档分解为多个下载段同时下载。该请求必须包含Range头信息来指示客户端希望得到的内容范围,并且可能包含If-Range来作为请求条件。响应必须包含如下的头部域:
Content-Range 用以指示本次响应中返回内容的范围;如果是Content-Type为multipart/byteranges的多段下载,则每一multipart段中都应包含Content-Range域用以指示本段的内容范围。假如响应中包含Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。
3xx(重定向类):为了完成指定的动作,必须接受进一步处理
300 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择已给首选的地址进行重定向。除非这是一个HEAD请求,否则该响应应当包括一个资源特性及地址的列表实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由Content-Type定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动做出最合适的选择。如果服务器本身已经有了首选的回馈选择,那么在Location中应当指明这个回馈的URI;浏览器可能会将这个Location值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的。
301 被请求的资源已被永久移到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。新的永久性的URI应当在响应的Location域中返回,除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或HEAD请求,浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
302 请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性的URI应当在响应的Location域中返回,除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或HEAD请求,浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
303 对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个显得资源。这个新的URI不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。新的URI应当在响应的Location域中返回,除非这时一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。
304 如果客户端发送了一个待条件的GET请求且该请求以被允许,而文档的内容(自上次访问以来或根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
305 被请求的资源必须通过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源,只有原始服务器才能建立305响应。
306 在最新的规范中,306状态码已经不再被使用。
307 请求的资源现在临时从不同的URI响应请求,由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性URI应当在响应的Location域中返回,除非这是一个HEAD请求,否则响应的实体中应当包含新的URI的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的URI发出访问请求。如果这不是一个GET或HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
4xx(客户端错误类):请求包含错误语法或不能正确执行
400 语义有误,当前请求无法被服务器理解,除非进行修改,否则客户端不应该重复提交这个请求;请求参数有误。
401 当前请求需要用户验证。
402 该状态码是为了将来可能的需求而预留的。
403 服务器已经理解请求,但拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。
404 请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状态到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可跳转的地址。404这个状态码被广泛用于当服务器不想揭示到底为何请求被拒绝或没有其他适合的响应可用的情况下。
405 请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow头信息用以表示出当前资源能够接受的请求方法的列表。鉴于PUT,DELETE方法会对服务器上的资源进行写操作,因为绝大部分的网页服务器都不支持或在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。
406 请求资源的内容特性无法满足请求头中的条件,因为无法生成响应实体。除非这是一个HEAD请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表实体。实体的格式由Content-Type头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行做出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。
407 与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个Proxy-Authenticate用以进行身份询问。客户端可以返回一个Proxy-Authorization信息头用于验证。
408 请求超时,客户端没有在服务器预设的等待时间内完成一个请求发送。客户端可以随时再次提交这一请求无需进行任何更改。
409 由于和被请求的资源的当前状态之间存在冲突,请求无法完成。该状态码的使用情况:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。冲突通常发生对于PUT请求的处理中。
410 被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应该被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或无法确定这个状况是否是永久的,那么就应该使用404状态码。除非额外说明,否则这个响应是可缓存的。410响应的主要目的是帮助网站管理员维护网站,通知用户该资源已经不在可用,并且服务器拥有着希望所有指向这个资源的远端链接也被删除。这类事件在限时、增值服务中很普遍。同样,410响应也被用于通知客户端在当前服务站点上,原本属于某个个人的资源已经不再可用。当然是否需要把所有永久不可用的资源标记为"410 Gone",以及是否需要保持此标记多长时间,完全取决于服务器拥有者。
411 服务器拒绝在没有定义Conten-Length头的情况下接受请求。在添加了表明请求消息体长度的有效Content-Length头之后,客户端可以再次提交该请求。
412 服务器在验证请求头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
413 服务器拒绝处理前请求,因为该请求提交的实体数据超过了服务器愿意或能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。
414 请求的URI长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务,比较少见。
415 对于当前球的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
416 如果请求中包含了Range请求头,并且Range中指定的任何数据范围都与当前资源的可用范围补充和,同时请求中又没有定义If-Range请求头,那么服务器就应当返回416状态码。
417 在请求头Except中指定的预期内容无法被服务器满足,或服务器是个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Except的内容无法被满足。
5xx(服务端错误类):服务器不能正确执行一个正确的请求
500 服务器遇到了一个未曾预料到状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
501 服务器不支持当请求所需要的某个功能,当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间之后恢复。如果能够预计延迟时间,那么响应中可以包含一个Retry-After头用以标明这个延迟时间,如果没有给出这个Retry-After信息,那么客户端当以处理500响应方式处理它。
504 作为网关或代理服务器尝试执行请求时,未能及时从上有服务器或辅助服务器收到响应。
505 服务器不支持,或拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。
506 由《透明内容协商协议》扩展,代表服务器存在内部配置错误。
507 服务器无法存储完成请求所必须的内容。这个状态被认为是临时的。
509 服务器达到带宽限制。这不是一个官方的状态码,但仍被广泛使用。
510 获取资源所需要的策略并没有满足。