浏览器http缓存

浏览器http缓存

浏览器http缓存大体流程图

浏览器http缓存

缓存好处

  • 缓解服务器压力(不用每次去请求资源);
  • 提高性能(打开本地资源速度固然比请求回来再打开要快得多);
  • 减小带宽消耗(我相信你能够理解);

缓存种类

  1. 浏览器缓存javascript

    • 浏览器对于缓存的处理是根据第一次请求资源时返回的响应头来肯定的。
  2. 代理服务器缓存
  3. 网关缓存
  4. 数据库缓存

通用首部字段

cache-control

缓存请求指令
指令 参数 说明
no-cahce 强制向源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age = [秒] 必需 指望在指定时间内的响应仍有效
max-state( = [秒]) 可省略 接收已过时的响应
min-fresh = [秒] 必需 指望在指定时间内发响应仍有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension - 新指令标记[token]
缓存响应指令
指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cahce 可省略 缓存前必需先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再想源服务器进行确认
proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
max-age = [秒] 必需 响应的最大Age值
s-maxage = [秒] 必需 公共缓存服务器响应的最大Age值
cache-extension - 新指令标记[token]
表示是否能缓存的指令

public指令java

Cache-Control: publicgit

当使用public指令时,则明确代表其余用户也可利用缓存。
private指令

Cache-Control: privategithub

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

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

no-cache指令算法

Cache-Control: no-cache数据库

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

客户端发送的请求若是包含no-cache指令,则表示客户端将不会缓存过的响应。因而,“中间”的缓存服务器必须把客户端请求转发给源服务器。若是服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。源服务器之后也将再也不对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操做。segmentfault

no-store指令浏览器

Cache-Control: no-store缓存

当使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息。所以,该指令规定缓存不能再本地存储请求或响应的任一部分。

s-maxage指令

Cache-Control: s-maxage=604800 (单位 :秒)

s-maxage指令的功能和max-age指令的相同,他们的不一样点是s-maxage指令适用于供多位用户使用的公共缓存服务器。

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版本的缓存服务器的状况却相反,max-age指令会被忽略掉。

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

使用only-if-cached指令表示客户端仅在缓存服务器本地缓存目标资源的状况下才会要求其返回。换言之,该指令要求缓存服务器不从新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout。

must-revalidate指令

Cache-Control: must-revalidate

使用must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。

若代理没法连通源服务器再次获取有效资源的话,缓存必须给客户端一条504(Gateway Timeout)状态码。

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

proxy-revalidate指令

Cache-Control: proxy-revalidate

proxy-revalidate指令要求全部的缓存服务器在接收到客户端带有该指令的请求返回响应以前,必须再次验证缓存的有效性。

no-transform指令

Cache-Control: no-transform

使用no-transform指令规定不管是在请求仍是响应中,缓存都不能改变实体主体的媒体类型。

Cache-Control扩展

cache-extension token

Cache-Control: private, community="UCI"

经过cache-extension标记(token),能够扩展Cache-Control首部字段内的指令。

如上例,Cache-Control首部字段自己没有community这个指令。借助extension tokens 实现了该指令的添加。若是缓存服务器不能理解community这个新指令,就会直接忽略。所以,extension tokens仅对能理解它的缓存服务器来讲是有意义的。

Date

首部字段Date代表建立HTTP报文的日期和时间。
HTTP/1.1协议使用在RFC1123中规定的日期时间的格式,以下示例。
Date: Tue, 03 Jul 2012 04:40:59 GMT
以前的HTTP协议版本中使用在RFC850中定义的格式,以下所示。
Date: Tue, 03-Jul-12 04:40:59 GMT
除此以外,还有一种格式。它与C标准库内的asctime()函数的输出格式一致。
Date: Tue Jul 03 04:40:59 2012

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

请求首部字段

If-Match/If-Modified-Since/If-None-Match/If-Range/If-Unmodified-Since

形如If-xxx这种形式的请求首部字段,均可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match

只有当If-Match的值与服务器上实体的Etag值一致时,服务器才会接受请求。反之,则返回状态码412 Precondition Failed的响应。

If-Modified-Since

若是在If-Modified-Since字段指定的日期时间后,资源发生了更新,服务器会接受请求。好比请求首部 If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT,而服务器上的 Last-Modified: Sun 29 Aug 2004 14:03:05 GMT,由于是在2004年4月15日以后更新过的资源,因此服务器会接受请求。

If-None-Match

只有在If-None-Match的字段值与Etag值不一致时,可处理该请求。与If-Match首部字段的做用相反。

If-Range

If-Range HTTP 请求头字段用来使得 Range 头字段在必定条件下起做用:当字段值中的条件获得知足时,Range 头字段才会起做用,同时服务器回复206 部份内容状态码,以及Range 头字段请求的相应部分;若是字段值中的条件没有获得知足,服务器将会返回 200 OK 状态码,并返回完整的请求资源。

If-Unmodified-Since

首部字段 If-Unmodified-Since和首部字段 If-Modified-Since的做用相反。他的做用是告知服务器,指定的请求资源只有在字段值内指定的日期时间以后,未发生更新的状况下,才能处理请求。若是在指定的日期时间后发生了更新,则以状态码412 Precondition Faied做为相应返回。

响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息、以及对客户端的附加要求等信息。

Age

首部字段Age能告知客户端,源服务器在多久前建立了响应。字段值的单位为秒。

若建立该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理建立响应时必须加上首部字段Age。Age消息头的值一般接近于0。表示此消息对象刚刚从原始服务器获取不久;其余的值则是表示代理服务器当前的系统时间与此应答消息中的通用消息头 Date 的值之差。

Etag

首部字段Etag能告知客户端实体标识。它是一种可将资源以字符串形式作惟一性标识的方式。服务器会为每份资源分配对应的Etag值。

另外,当资源更新时,Etag值也须要更新。生成Etag值时,并无统一的算法规则,而仅仅是由服务器来分配。

强Etag值:不论实体发生多么细微的变化都会改变其值。Etag: "usagi-1234"

弱Etag值:弱Etag值只用于提示资源是否相同。只有资源发生了根本改变,产生差别时才会改变Etag值。这时,会在字段值最开始处附加W/。

Etag:W/"usagi-1234"

实体首部字段

Expires

Expires: Wed, 04 Jul 2012 08:26:05 GMT

首部字段 Expires会将资源失效的日期告知客户端。缓存服务器在接受到含有首部字段 Expires的响应后,会以缓存来应答请求,在 Expires字段值指定的时间以前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。

源服务器不但愿缓存服务器对资源缓存时,最好在Expires字段内写入与首部字段Date相同的时间值。

可是,当首部字段Cache-Control有指定max-age指令时,比起首部字段Expires,会优先处理max-age指令。

Last-Modified

Last-Modified: Wed, 23 May 2012 09:59:55 GMT

首部字段 Last-Modified指明资源最终修改时间。通常来讲,这个值就是Request-URI指定资源被修改的时间。但相似使用CGI脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。

参考与推荐

《图解HTTP》
缓存详解
浅谈web缓存
浅谈浏览器缓存

相关文章
相关标签/搜索