HTTP报文首部
HTTP请求报文由请求行(方法,URI,HTTP版本),HTTP首部字段等部分构成。
HTTP响应报文由状态行(HTTP版本,状态码(数字和原因短语))HTTP首部字段3部分构成。
4种HTTP首部字段类型
通用首部字段:请求报文和响应报文都会使用的首部
请求首部字段:从客户端向服务端发送报文时使用的首部,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息
响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
实体首部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息
HTTP/1.1通用首部字段
Cache-Control
通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
Cache-Control:private,max-age=0,no-cache
缓存请求指令:
指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age=([秒]) | 必需 | 响应的最大Age值 |
max-stale=([秒]) | 可省略 | 接收已过期的响应 |
min-fresh=[秒] | 必需 | 期望在指定时间内的响应仍有效 |
no-transform | 无 | 代理不接更改媒体类型 |
only-if-cached | 无 | 从缓存中获取资源 |
cache-extension | 新指令标记(token) |
缓存响应指令
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不接更改媒体类型 |
must-revalidate | 无 | 可缓存但必须再向服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒] | 必需 | 响应的最大Age值 |
s-maxage=[秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
no-cache指令
Cache-Control:no-cache
使用no-cache指令的目的是为了防止从缓存中返回过期的资源,缓存会向源服务器进行有效期的确认后处理资源
客户端:发送的请求中包含no-cache指令,则表示客户端将不会接收缓存过的响应。于是“中间”缓存服务器必须把客户端请求转发给源服务器
服务器:如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存,源服务器以后也不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作
Cache-Control:no-cache=Location
由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。相反,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数
no-store指令
Cache-Control:no-store
当使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息,因此该指令规定缓存不能在本地存储请求或响应的任何一部分
s-maxage指令
Cache-Control:s-maxage=604800(单位:秒)
s-maxage指令的功能和max-age指令相同,不同点在于s-maxage指令只适用于供多位用户使用的公共缓存服务器,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。
当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理
max-age指令
Cache-Control:max-age=604800(单位:秒)
客户端:当客户端发送的请求中包含max-age指令时,如果判定缓存时间的数值比·1指定时间的数值更小,那么客户端就接收缓存的资源。当指定的max-age=0,那么缓存服务器通常将请求转发给源服务器
服务端:服务器返回的响应中包含max-age指令,缓存服务器将不对资源的有效性再作确认,而max-zge数值代表资源保存为缓存的最长时间
⚠应用HTTP/1.1版本的缓存服务器在遇到同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略Expires首部字段,而HTTP/1.0版本的缓存服务器则相反,max-age指令被忽略
min-fresh指令
Cache-Control:min-fresh=60
min-fresh指令要求缓存服务器返回至少还未过指定时间的缓存资源。
max-stale指令
Cache-Control:max-stale=3600
使用max-stale指示缓存资源,即使过期也照常接收
如果指令未指定参数值,那么无论过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale指定的时间内仍旧会被客户端接收
only-if-cached指令
Cache-Control:only-if-cached
表示客户端仅在缓存服务器本地缓存目标资源的情况下才要求其返回。该指令要求服务器不重新加载响应,也不再次确认资源有效性。若请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout
must-revalidate指令
Cache-Control:must-revalidate
代理向源服务器再次验证即将返回的响应缓存目前是否仍然有效。如果代理无法连通服务器再次活期有效资源,缓存必须给客户端一条504状态码
使用must-revalidate指令忽略请求的max-stale指令,即使首部使用了max-stale,也不会有效果
proxy-revalidate指令
Cache-Control:proxy-revalidate
proxy-revalidate要求所有缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
no-transform指令
Cache-Control:no-transform
无论·是在请求还是响应中使用,缓存都不能改变实体主体的媒体类型,这样可防止代理压缩图片等类似操作
Cache-Control扩展
cache-control token
Cache-Control:private,community=”UCI”
通过cache-extension标记可以扩展Cache-Control首部字段内的指令。如例子,Cache-Control首部字段本身没有community这个指令。借助extensions tokens实现了该指令的添加。如果缓存服务器无法理解这个新指令就会直接忽略
Connection
作用:
- 控制不再转发给代理的首部字段
- 管理持久连接
Connection:不再转发的首部字段名
控制不再转发给代理的首部字段
在客户端发送请求和服务器返回响应内,使用Connection首部字段,可控制不再转发给代理的首部字段
管理持久连接
Connection:close
HTTP/1.1版本的默认连接是持久连接,为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,指定Connection首部字段为Close
HTTP/1.1之前的版本默认连接是非持久连接。因此,如果想要在旧版本的HTTP协议上维持持续连接,则需要指定Connection为Kepp-Alive
Pragma
Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义
Pragma:no-cache
该首部字段属于通用首部字段,但只用在客户端发送请求中。客户端要求所有的中间服务器不返回缓存的资源。所有中间服务器如果都能以HTTP/1.1为基准,那直接采用Cache-Control:no-cache指定缓存的处理方式是最为理想的。但要整体掌握中间服务器使用的HTTP协议版本不现实,发送请求一般同时包含两个首部字段
Cache-Control:no-cache
Pragma:no-cache
Trailer
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码时
Trailer:Expires
—(报文主体)—
Expires:Tue,28 Sep 2004 23:59:59 GMT
Transfer-Encoding
规定了传输报文主体时采用的编码方式
HTTP/1.1的传输编码方式仅对分块传输编码有效
Upgrade
Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行同心,其参数值用来指定一个完全不同的通信协议
1 | 客户端=》服务器 |
Connection的值被指定为Upgrade,Upgrade的首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此使用首部字段Upgrade时需要额外指定Connection为Upgrade
Via
使用Via是为了追踪客户端和服务器之间的请求和响应报文的传输路径
报文经过代理或网关时,会现在首部字段Via中附加该服务器的信息,然后再进行转发。Via不仅用于追踪报文的转发,还可避免请求回环的发生,所以必须在经过代理时附加该首部字段内容
Warning
HTTP/1.1的Warning首部是从HTTP/1.0的响应首部(Retry-After)演变过来的,该首部会告知用户一些与缓存相关的问题的警告
&eg:
Warning:113 gw.hackr.jp:8080 “Heuristic expiration” Tue,03 Jul=>2012 05:09:44 GMT
Warning:【警告码】【警告主机:端口号】“【警告内容】”(【日期时间】)
HTTP/1.1警告码
警告码 | 警告内容 | 说明 |
---|---|---|
110 | Response is stale(响应已过期) | 代理返回已过期的资源 |
111 | Revalidation failed(再验证失败) | 代理验证资源有效性时失败(服务器无法到达等原因 |
112 | Disconnection operation(断开连接操作) | 代理与互联网连接故意切断 |
113 | Heuristic expiration(试探性过期) | 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下) |
199 | Miscellaneous warning(杂项警告) | 任意警告内容 |
214 | Transformation applied(使用了转换) | 代理对内容编码或媒体类型等执行了某些处理时 |
299 | Miscellaneous persistent warning(持久杂项警告) | 任意警告内容 |