一、头信息解读
#HTTP的头域包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号和域值三部分组成。 #通用头部: 是客户端和服务器都可以使用的头部,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能,如Date头部。 #请求头部: 是请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据,如Accept头部。 #响应头部: 便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部。 #实体头部: 指的是用于应对实体主体部分的头部,比如,可以用实体头部来说明实体主体部分的数据类型,如Content-Type头部。
1、HTTP通用头
#请求报文和响应报文两方都会使用的首部
2、HTTP请求头
#请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应
3、HTTP响应头
#响应头向客户端提供一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些头部有助于客户端处理响应,并在将来发起更好的请求
4、HTTP实体头
#实体头部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。总之,实体头部可以告知接收者它在对什么进行处理。请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成
下面具体解读一下
二、通用首部(通用头)
1、Cache-Control 缓存控制
#通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
1.1缓存请求指令
1.2缓存响应指令
1.3是否能缓存的指令

#① public指令 Cache-Control:public #设置为public时 当指定public指令时,则明确表示其他用户也可利用缓存 #② private指令 Cache-Control:private #设置为private时 当指定private指令时,响应只以特定的用户作为对象,这与public指令的行为相反。缓存服务器会对该用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器不会返回缓存。 #③ no-cache指令 Cache-Control:no-cache no-cache指令的目的是为了防止从缓存中返回过期的资源,缓存会向源服务器进行有效期确认后处理资源。 客户端发送的请求中如果包含no-cache指令,则表示客户端不会接收缓存过的响应,缓存服务器必须把客户端请求转发给源服务器。从源服务器返回最新资源后,缓存服务器依然可以将最新资源进行缓存,然后再返回给客户端,除非服务器端也返回no-cache指令。 服务端返回的响应中如果包含no-cache指令,那么缓存服务器不能对资源进行缓存,源服务器以后也不会再对缓存服务器请求中提出的资源有效性进行确认。 Cache-Control:no-cache=Location 只能在响应指令中指定该参数,通过服务器端返回的指令来确定客户端是否可以使用缓存。 客户端在接收到这个被指定参数值的报文首部后,就不能使用缓存。换句话说,无参数值的首部字段可以使用缓存。 # ④ no-store指令 Cache-Control:no-store 暗示请求或响应中包含机密信息,该指令规定不进行任何缓存。
1.4指定缓存期限和认证指令

#① s-maxage指令 Cache-Control:s-maxage=3600 (单位:秒) 它与max-age的指令相同,不同点是s-maxage只适用于供多位用户使用的公共缓存服务器。对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。 使用这个指令后,会直接忽略对Expires首部字段及max-age指令的处理。 #② max-age指令 Cache-Control:max-age=3600 (单位:秒) 当客户端发送的请求中包含该指令时,如果判定缓存资源的缓存时间比指定的时间数值更小,那么客户端就接收缓存的资源。如果max-age的值为0,那么缓存服务器需要将请求转发给源服务器。 当服务器返回的响应中包含该指令时,缓存服务器将不会对资源的有效性进行确认,此时max-age代表资源保存为缓存的最长时间。 HTTP/1.1版本的缓存服务器遇到同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略掉Expires首部字段。但是HTTP/1.0版本的缓存服务器情况却相反,max-age指令会被忽略掉。 #③ min-fresh指令 Cache-Control:min-fresh=60 (单位:秒) 这个指令要求缓存服务器返回还未过指定时间的缓存资源。 #④ max-stale指令 Cache-Control:max-stale=3600 (单位:秒) 指示缓存资源,即使过期,但只要处于max-stale指定的时间内仍然会被客户端照常接收。如果该指令未指定相应参数,那么无论过了 多久,客户端都会接收响应。 #⑤ only-if-cached指令 Cache-Control:only-if-cached 该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性,如果请求缓存服务器的本地缓存无响应,则返回状态码504。 #⑥ must-revalidate指令 Cache-Control:must-revalidate 使用该指令时,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效,若代理无法连接源服务器获取有效资源的话,缓存必须给客户端一个504的状态码。另外,使用该指令将忽略请求的max-stale指令。 #⑦ proxy-revalidate指令 Cache-Control:proxy-revalidate 当客户端的请求包含该指令时,缓存服务器在返回响应之前,必须再次验证缓存的有效性。 #⑧ no-transform指令 Cache-Control:no-transform 该指令规定无论在请求还是在响应中,缓存都不能改变主体的媒体类型,这样可以防止缓存或代理压缩图片等类似操作。 #⑨ cache-extension token Cache-Control:private,community="UCI" 通过cache-extension标记(token),可以扩展Cache-Control首部字段内的指令。如上添加了community这个新指令,如果缓存服务器不能够理解community这个新指令,就会直接忽略。因此,extension tokens仅对能理解它的缓存服务器有效。
2、connection 长连接

#它有两个作用: #① 控制不再转发给代理的首部字段 Connection:Upgrade (不再转发的首部字段名) //操作方式是将首部字段Upgrade删除后再转发 #② 管理持久连接 HTTP/1.1版本的默认连接都是持久连接(长连接),然后客户端会在持久连接上连续发送请求,当服务器想明确断开连接时,则指定Connection首部字段为Close。 Connection:Close #如果关闭之后下次连接还需要三次握手 HTTP/1.1之前的版本默认的都是非持久连接(短连接),如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection的值为Keep-Alive。 Keep-Alive:timeout=10,max=500 Connection:Keep-Alive
3、Date 时间格式

HTTP/1.1协议使用RFC1123中规定的日期时间的格式,如下: Date:Tue,03 Jul 2012 04:40:59 GMT HTTP/1.1之前的协议使用RFC850中定义的格式,如下: Date:Tue,03-Jul-12 04:40:59 GMT
4、Trailer
#此字段会事先说明在报文主体后记录了哪些首部字段,可用于HTTP/1.1版本分块传输编码时。 下例中,指定首部字段Trailer的值为Expires,在报文主体之后(分块长度0之后)出现了首部字段Expires。
5、Transfer-Ending
#此字段规定了传输报文主体时使用的编码方式,HTTP/1.1的传输编码方式仅对分块传输编码有效。
6、Upgrade
#此字段用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。 下例中,Upgrade对象仅限于客户端和邻接服务器之间,因此,在使用了Upgrade时,还需要额外指定Connection:Upgrade,对于附有Upgrade字段的请求,服务端可使用101状态码作为响应返回。
7、Via 经过,通过
#此字段是为了追踪客户端与服务端之间的请求和响应报文的传输路径。报文在经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发,使用它可以避免回环的发生,所以必须在经过代理时附加该首部字段内容,如下:
Via首部为了追踪传输路径,经常会和TRACE方法一起使用。比如,代理服务器接收到由TRACE方法发送过来的请求(Max-Forwards:0)时,代理服务器就不能转发该请求了,这种情况下,代理服务器会将自身的信息附加到Via首部后,返回该请求的响应。
8、Warnning
#该首部字段通常会告知用户一些与缓存相关的一些问题的警告。格式如下: Warning:[警告码][警告的主机:端口号]"[警告内容]"
9、Pragma (了解)

它用在客户端发送的请求中,客户端会要求所有的中间服务器不返回缓存的资源。 Pragma:no-cache 它是HTTP/1.1之前版本的历史遗留字段,仅作为HTTP/1.0的向后兼容。如果所有的中间服务器都使用HTTP/1.1版本协议的话,那么直接使用Cache-Control:no-cache是最理想的,但所有的中间服务器使用的HTTP协议版本并不完全一致。因此,发送的请求会同时含有下面两个字段。 Cache-Control:no-cache Pragma:no-cache