Http之Cache-Control

摘录自《图解HTTP》

通过首部字段 Cache-Control ,可以控制缓存的工作机制。

指令的参数时可选的,多个指令之间通过,分隔。Cache-Control的指令可用于请求与响应时。

缓存请求指令

指令 参数 说明
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)

具体说明

表示是否能缓存的指令

  • public

    Cache-Control: public
    

    明确表明其他用户也可以利用缓存

  • private

    Cache-Control: private
    

    当private指令时,响应只以特定的用户作为对象,这与public指令的行为相反。

    缓存服务器会对该用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

  • no-cahe

    Cache-Control: no-chache
    

    no-cache指令是为了防止从缓存中返回过期的资源。

    客户端发送的请求中若包含no-cache指令,则表示客户端不接收缓存过的响应。于是,中间缓存服务器必须把客户端请求转发给源服务器。

    如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。源服务器以后将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。

    Cache-Control: no-cache=Location
    

    由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。

控制可执行缓存的对象的指令

  • no-store

    Cache-Control: no-store
    

    当使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息。

    因此,该指令规定不能在本地存储请求或响应的任一部分。

从字面意思很容易把 no-cache误解成不缓存,但事实上no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。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指令时,若判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0,那么缓存服务器需要将请求转发给源服务器,

    当服务器返回的响应中包含max-age指令时,缓存服务器将不对资源的有效性再作确认,而max-age数值代表资源保存为缓存的最大时间。

    应用HTTP/1.1版本的缓存服务器遇到同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略Expires首部字段。而HTTP/1.0版本的缓存服务器则相反。

  • min-fresh

    Cache-Control: min-fresh=60 (单位:秒)
    

    min-fresh 要求缓存服务器返回至少还未过指定时间的缓存资源。

    比如,当指定min-fresh 60秒时,则在这60秒内如果有超过有效期限的资源都无法作为响应返回了。

  • 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状态码。

    另外,使用此指令会忽略请求的max-stale指令(即使已经在首部使用了max-stale,也不会再有效果)

  • proxy-revalidate

    Cache-Control: proxy-revalidate
    ```    - 
    此指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
    
    
  • no-transform

    Cache-Control: no-transform
    

    此指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。

    这样做可以防止缓存或代理压缩图片等类似操作

Cache-Control 扩展

  • cache-extension

    Cache-Control: private, community="UCI"
    

    通过 cache-extension标记(token),可以扩展Cache-Control首部字段内的指令。

    如上例,Cache-Control首部字段本身没有community这个指令。借助extension tokens 实现了该指令的添加。如果缓存服务器不能理解community指令,则直接忽略。因此 extension tokens 仅对能理解它的缓存服务器是有意义的。

相关链接

  • Retrofit2.0+okhttp3缓存机制以及遇到的问题
  • OkHttp3 Cache
  • Mozilla Developer Network----Cache-Control

你可能感兴趣的:(Http之Cache-Control)