一、HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP报文首部。首部内容分别为客户端和服务器处理请求和响应提供所需要的信息。
1、HTTP请求报文
在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成
2、HTTP响应报文
在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分构成
3、请求和响应HTTP报文示例
二、HTTP首部字段
HTTP首部字段是构成HTTP报文的要素之一,它可以给浏览器、服务器提供报文主体大小、所使用的语言、认证信息等。
1、HTTP首部字段结构
HTTP首部字段是由字段名和字段值构成,中间用冒号(:)分隔,如下:
Content-Type:text/html
单个HTTP首部字段可以有多个值,用逗号(,)分隔,如下:
Keep-Alive:timeout=15,max=100
2、HTTP首部字段类型
① 通用首部字段
请求报文和响应报文两方都会使用的首部
② 请求首部字段
从客户端向服务器端发送请求报文时使用的首部
③ 响应首部字段
从服务器端向客户端返回响应报文时使用的首部
④ 实体首部字段
针对请求报文和响应报文实体部分使用的首部
3、HTTP首部字段一览
通用首部字段
请求首部字段
响应首部字段
实体首部字段
4、非HTTP首部字段
在HTTP协议通信交互中使用到的首部字段,不限于RFC2612中定义的47种首部字段,还有Cookie、Set-Cookie和Content-Disposition等在其他RFC中定义的首部字段。这些非正式的首部字段统一归纳在RFC4229 HTTP Header Field Registrations中。
5、End-to-end 首部和Hop-by-hop首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型。
① 端到端首部
在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
② 逐跳首部
此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1之后的版本,如果要使用此首部,需要提供Connection首部字段。
以下是HTTP/1.1中的逐跳首部:(除了这8个首部字段外,其他的所有字段都属于端到端首部)
三、HTTP/1.1通用首部字段
1、Cache-Control
通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
1.1 缓存请求指令
1.2 缓存响应指令
1.3 表示是否能缓存的指令
① public指令
Cache-Control:public
当指定public指令时,则明确表示其他用户也可利用缓存
② private指令
Cache-Control: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指令会被忽略掉。