浏览器缓存控制机制

cache-control

Posted by Galvin on March 10, 2019

概述

http1.1缓存控制 浏览器缓存分为强制缓存和协商缓存

强制缓存

控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。 控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。

浏览器缓存控制

image

CDN缓存控制

  • 如果源站设置了 no-cache 、private、 max-age = 0 都遵循源站,CDN 是不会进行缓存的。
  • 如果源站返回的vary头包含cookie每次刷新cookie的值都在变,所以cache命中不了 image

备注

  • Cache-Control:请求头和响应头都可以设置,控制网页缓存
    • public:所有内容都将被缓存(客户端和代理服务器都可缓存)
    • private:所有内容只有客户端可以缓存,Cache-Control的默认取值。
    • no-cache:客户端缓存内容,是否使用缓存则需要经过协商缓存来验证决定。即需要向服务器确认缓存是否是最新
    • no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
    • max-age:max-age=xxx (xxx is numeric)表示缓存内容将在xxx秒后失效
  • 强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,返回200,重新返回资源和缓存标识,再存入浏览器缓存中;生效则返回304,继续使用缓存。
  • 强制刷新 (command+shift+R):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache),服务器直接返回 200 和最新内容。