Blog icon indicating copy to clipboard operation
Blog copied to clipboard

浅析浏览器缓存

Open ustccjw opened this issue 11 years ago • 0 comments

浅析浏览器缓存

浏览器自身的缓存

浏览器自身提供了默认的缓存机制,也就是说在不指定expires和cache-control的情况下,浏览器也会对资源进行缓存。那么缓存多久呢,实际上是infinite。因为浏览器的缓存替换算法依赖于后续缓存资源,而不是取决于自身。

cache-control和expires

cache-control和expires是服务器端指明资源的缓存时间。也就是资源的缓存时间不再依赖于后续缓存资源,而是取决于自身的设置时间(其实还是受限于浏览器缓存的大小)。可以理解为,在指定的cache-control和expires有效期内,资源缓存的优先级最高。 值得思考的是:当cache-control和expires过期时,资源并没有立刻从缓存里移除,可以猜测此时浏览器应该把该资源的缓存优先级降低。只有cache-control:no-cache时,浏览器才不缓存该资源。 也就是服务器设置cache-control和expires会影响资源的缓存优先级,影响浏览器自身的缓存策略。

Etag和Last-Modified

Etag和Last-Modified是服务器端对资源的唯一性标识。唯一性标识当然是用作验证的。(先不考虑cache-control和expires)浏览器加载一个资源时,当浏览器缓存有该资源,那么浏览器会发起一个Conditional GET Request(含有If-None-Match或If-Modified-Since字段,分别对应Etag和Last-Modified)。服务器端确定资源没修改时就返回304 Not Modified,浏览器可以使用缓存资源。

cache-control和expires AND Etag和Last-Modified

ok,现在开始有意思了!cache-control和expires是设置资源缓存的时间,Etag和Last-Modified是标识资源唯一性用于验证的,所以两者实际上是协同作用的,两者应该用AND而不是VS连接。 cache-control和expires带来的副作用是浏览器端可以不需要发送Conditional GET Request,直接使用缓存资源。(update:发现即便没设置 cache-control和expires,被缓存的资源也可能不发送 Conditional GET Request,比如:有 Last-Modified 时浏览器会自己生成一个 expires) 但是注意这仅仅是副作用,在以下场合生效:

  • 通过url栏回车加载;
  • 通过超链接加载;
  • 通过back和forward加载;
  • 以上的资源不是直接请求的资源(不是 url 栏输入地址直接请求)。

在以下场合,浏览器会发送Conditional GET Request(前提是缓存中有该资源):

  • cache-control和expires不存在或者过期;
  • 用户通过点击刷新按钮或者F5(与cache-control和expires无关)。

cache-control:max-age=0 VS cache-control:no-cache

这个讨论的是浏览器发送cache-control的情形: max-age=0会导致资源被本地缓存时,总是向服务器端发送Conditional GET Request(类似刷新效果); no-cache会导致浏览器总是向服务器发送一个“无条件请求”(类似强刷新的效果)。

response cache-control:max-age=0 也会导致资源被本地缓存时,总是向服务器端发送Conditional GET Request。

对于cache-control,后续再浅析下。

ustccjw avatar Dec 01 '14 08:12 ustccjw