- 状态码的定义
本章定义了一系列的状态码(服务器返回的)以及它所依附的方法。一共分为以下几类:
1xx:继续
2xx:正常
3xx:重定向
4xx:客户端错误
5xx:服务器端错误
10.1 1xx信息
1xx信息构成比较简单,由Status-Line和可有可无的头,然后由一个空行终结。由于1.0的版本没有定义1xx,所以,服务器对于使用1.0的客户端,不应该返回1xx码。
在正式接受正常响应以前,一个客户端应该准备着接受1个或是多个1xx的状态码,管他是否期望收到100. 一个客户端不期望的返回状态码会被丢弃。
除非客户端和代理间的连接断开了,否则,代理应该无条件转发1xx响应。哦,还有一种情况,比如代理在转发信息给客户端的时候,自己加上了Expect: 100-continue这个头域,那么他就不必转发100-continue。
10.1.1 100 continue 继续
100的意思是,服务器用于通知客户端,你的初始化请求,我已经收到,而且没有被拒绝,你可以继续的发送剩余的请求(如果你有的话,当然,如果你的请求已经完了,那么可以忽略)。当服务器处理完成的时候,需要发送最终响应。
10.1.2 101 协议交换
这个状态代表服务器将遵守客户端的请求,通过Upgrade message header来进行协议交换。 这个头域中定义了服务器要交换的对象,在结束101的空行后,将立即进行协议交换。为什么要改变协议呢?因为这样会带来好处,例如,协议版本从1.0换到1.1能带来绝对的好处。
10.2 2xx 成功
这个系列的状态表示客户端的请求已经被服务器收到、理解,并被接受。
10.2.1 200 ok
代表执行成功,当然各个方法的成功的定义不同。
GET 将返回一个带有信息主体的响应信息。
HEAD 不带信息主体的响应信息。
POST 将返回信息,包含了动作的结果
TRACE 返回一个信息包含这个请求被最后的服务器接收到。
10.2.2 201 创建
这个请求表明服务器已经按照请求成功的创建了资源,而这个刚刚创建的资源,能够被引用。他们写在返回的实体信息中,并描述了资源的特征,以便客户端能够选择一个最合适的去使用。信息的的格式在Content-Type中,服务器必须要在成功创建了以后才能返回201,表示已经成功创建,否则应该返回202(已经接受,此时创建过程可能还在进行)。在响应信息头中,应该返回ETag,用于标识刚被创建的资源etag。
10.2.3 202 已接受
202表示服务器已经接受了请求,而请求的执行还在进行中。最后的结果,有可能成功,也有可能执行的时候,才被拒绝。因此说。202是不承担责任的,他的设计的目的,主要是为了避免执行过程太长,而用户代理一直无穷的等待他的完成。当然,应该返回一个标识,告诉最后期望完成的时间,以便客户什么时候来检查执行结果。
10.2.4 203 非权威信息
203表示响应信息的实体头域元信息,不能从源服务器获得,而是从本地或是从第三方取得的,虽然不是必须的,显然比发送200要更为合适。
10.2.5 204
204信息没有包含主体信息,仅仅用于更新头域的元信息。他不会改变视图(html在浏览器中的显示方式)而更新元信息的头域。由于没有body信息,因此,这样的响应实体包含一个头域,并以一个空行结束。
10.2.6 205 内容重置
服务器已经完成了请求,用户代理应该重新设置导致请求被发送的文件观点.这种应答主要是故意允许输入行动通过用户输入发生,伴随而来的是对给出形式的清理为了让用户可以轻松开始另一个输入行动.应答严禁包含任何实体.(没看明白,很绕)
10.2.7 206 局部内容
服务器对于资源已经完成了部分GET请求.请求必须包含一个范围报头区域(14.35节),指出了想要的范围,而且也有可能包含一个使请求条件化如果-范围报头区域
应答必须包含以下的报头区域:
或者是一个内容范围报头区域指出包含此现应答的范围,或者是对每个部分来说一个多部分的/字节范围的内容形式都包含内容范围报头.如果内容长度报头区域在当前应答中,那么它的值必须和实际在报文正文重传送的OCTET相匹配.
-日期
-Etag或者内容位置,如果能够在一个200应答中对于同一个请求发送报头.
-终止,缓存控制,和/或者变化,如果区域值与对于同一个变量以前发送的应答中的区域值不一样.如果206应答是一个使用强缓存确认的的如果范围请求的结果,那么应答不应该包含其他实体报头. 如果应答是一个使用弱缓存确认的的如果范围请求的结果,那么应答严禁包含其他实体报头,这么做是为了防止缓存实体正文和升级报头之间的矛盾性.否则,应答必须包含所有对同一个请求返回的200应答中的实体报头.
如果Etag或者上次更改的报头不严格匹配,缓存严禁将一个206请求与其他以前缓存的内容连接起来
一个并不支持范围和内容范围的缓存严禁缓存206(部分)应答.
10.3 重新定向 3xx.
3xx系列的代码,代表重定向的意思。就是说,服务器告诉请求的客户端,需要进行下一步的动作。重定向的时候,不需要与用户交互就能进行,除非重新的请求方法是GET或是HEAD的时候。另外要防止死循环的重定向,一个客户端应该有检查这种事情的能力。在以前,重定向的次数有限制到5次,这个也需要注意的/
300 多种选择(很少用到)
这个响应信息,可能返回一个可选的选项,等待用户去选择。
301 永久移动(这个一般用于DNS中的URL记录)
这个响应是告诉请求的客户端,请求的资源已经被永久的移动了,并会在头域的Location中返回新的URI地址,除非特别说明,此请求是能缓存的。
302 发现(一般的PHP中的header函数实现的重定向会返回这个状态码)
请求的资源,暂时被更改了一个位置存放。与301不同的是,客户将来需要继续请求这个资源,因为他随时可能回来。。。
303 见其他(没用过)
304 没有改变(一般用户缓存)
如果一个客户端GET请求一个资源,并且此资源是允许访问的,但是服务器上的文档并没有改变,那么服务器响应此状态码。304不能响应信息主体,必须在头域后以空行结束。
此响应应该包含以下头域
Data
Etag
Expire、Cache-Control域。
305 使用代理
此响应信息是告诉客户端,必须使用响应信息中的代理来访问。代理地址在头域的Location中。
306 没用
用于以前的版本,现在没用使用。
307 临时重发
以上的URI需要在头域中的Location中指定,否则需要返回一个超文本提示和指向新URI的超文本链接。
4xx 客户端错误
4xx系列是说,客户端的请求有错误,除非是HEAD请求,否则应该在实体信息中,告之客户端,错误的详细信息。
400 错误请求
出现这个响应,是由于客户端的请求语法不对,客户端不应该不做改变的多次重试。
401 未经授权的
返回此状态表示,服务器需要认证用户授权,并会在头域中返回WWW-Authenticate,而客户端收到这个状态码以后,需要重新请求,并带上Authorization头域。
402 需要支付的
暂时保留
403 被禁止的
虽然服务器收到了请求,但是该请求行为被禁止了。除非是HEAD请求,服务器应该告之客户端被禁止的原因,但是如果服务器不想告之原因,应该返回404错误。
404 没有找到
简单的讲就是请求的资源不存在,而且并不清楚是暂时的还是永久的。同时,在403被禁止的时候,不想讲明原因,也应该返回404.
405 方法不被允许
请求的方法是不被允许的,而返回信息中,应该返回一个被允许的方法列表。
406 不可接受
用户客户端请求的可接受头域(如Accepted,Accepted-Charset,Accepted-Encoding或Acceepted-Language),服务器无能力返回,只好返回一个406。除非是HEAD请求,否则响应应该包含一个实体信息,此实体信息应该包含一个可得的实体特征和位置列表。
407 需要代理验证
这个跟401极其相似,不同的是,使用代理来进行认证。代理需要发送一个Proxy-Authorization的头的响应信息,然后客户端用一个带Authentication头域的请求进行重试。
408 请求超时
由于是长连接,当客户端在服务器允许等待的时间内,没有发送请求的话,会发送这么一个响应信息。
409 冲突(少见)
常见于PUT请求,等需要改变资源的时候,由于资源的冲突,导致请求无法完成。
410 永久的移除了
此响应跟404的区别是,他很确定资源被永久的移除出来,此结果可以缓存。
411 需要长度
依据字面意思,就懂了。需要客户端带上适合的content-length的头域,继续请求。
412 先决条件失败(不懂)
413 请求实体太大
服务器拒绝了请求,因为实体信息过大,服务器可能关闭连接,以防止客户端重试。如果只是暂时的,服务器应该返回一个Retry-After来指明什么时候可以重试。
414请求URI过长
依据字面意思,应该了解了。不长出现,主要可能是GET太长了。
415 请求的媒体类型不被支持
头域中的Content-Type 不被服务器支持
416 请求范围不足
请求中包含一个Rang域,并且头域中的Range-specificer值没有和已选资源中的extent重叠,并且头域没有包含一个If-Range请求头域。
417 期望失败
请求头域中的Expect不被服务器满足
5xx 服务器出现错误
此类状态码主要用于告之客户服务器产生了错误,除非是HEAD方法,否则应该返回一个实体和信息,告之用户是否是暂时的?
500 服务器内部错误
501 不能实现
当服务器不能识别请求方法,并且不支持他请求的资源的时候,这个返回比较合适。
502 网关坏了
503 服务器不可用(Service Unaviable)
此响应用于服务过载或者维护的时候,这个只是暂时的,至于什么时候可以重试,可以以Retry-After的头域告之用户。当服务器维护或过载时候,这个并不是必须的。如果不返回Retry-After,那么客户端处理这个响应应该跟500一样。
504 网关超时
505 HTTP版本不支持
此响应应该包含一个实体,描述了为什么不被支持和支持的协议版本。