0%

HTTP首部字段

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
2
3
4
5
6
7
8
客户端=》服务器
GET/index.html HTTP/1.1
Upgrade:TLS/1.0
Connection:Upgrade
服务器=》客户端
HTTP/1.1 101 Switching Protocols
Upgrade:TLS/1.0,HTTP/1.1
Connection:Upgrade

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(持久杂项警告) 任意警告内容