浏览器缓存

缓存分为服务端缓存(比如 Nginx、Memcached)和客户端缓存(比如 浏览器)。

以下是关于浏览器缓存的一些记录

缓存机制

浏览器缓存控制机制有两种:

1、Meta标签

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">

清除浏览器中的缓存,必须从服务端获取最新内容,但不是所有浏览器都支持

2、HTTP头信息

Expires:即在 HTTP 头中指明具体失效的时间(HTTP/1.0)

Cache Control:max-age 在 HTTP 头中按秒指定失效的时间,优先级高于Expires(HTTP/1.1)

Last-Modified/If-Modified-Since:文件最后一次修改的时间(精度是秒,HTTP/1.0),需要Cache-Contral过期

Etag:当前资源在服务器的唯一标识(生成规则由服务器决定)ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的,优先级高于Last-Modified;在分布式的Web系统中,当访问落在不同的物理机上时会返回不同的ETag,进而导致304失效,降级为200请求(HTTP/1.1),需要Cache-Contral过期

Pragma:no-cache 兼容HTTP/1.0

缓存状态码

200 OK (from cache) 是浏览器没有跟服务器确认,直接用了浏览器缓存;

304 Not Modified 是浏览器和服务器多确认了一次缓存有效性,再用的缓存。

304 Not Modified 比 200 OK (from cache) 慢,指的是浏览器还向服务器确认了下 "If-Not-Modified",才用的缓存

Cache验证

Freshness验证

和浏览器策略以及Cache Control(HTTP/1.1)与Expires(HTTP/1.0)有关

最好的请求是不必与服务器进行通信的请求:通过响应的本地缓存,可以避免所有的网络延迟以及数据传输的数据成本。

Cache-Contral

  • no-cache 必须先与服务器确认返回的响应是否被更改

  • no-store 直接禁止浏览器和所有中继缓存存储返回的任何版本的响应

  • public 响应可被任何缓存区缓存

  • private 浏览器可以缓存private响应,不允许任何中继缓存对其进行缓存;例如,用户浏览器可以缓存包含用户私人信息的HTML网页,但是CDN不能缓存

  • max-age 缓存最长时间

缓存策略

http-cache-decision-tree.png

HTML5 Boilerplate 项目nginx配置文件样例

# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
  expires -1;
}

# Feed
location ~* \.(?:rss|atom)$ {
  expires 1h;
}

# Media: images, icons, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

# CSS and Javascript
location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
}

Validation验证

Last-Modified和ETag

通过验证令牌可以进行高效的资源更新检查:如果资源未更改,则不会传输任何数据

http-cache-control.png
Status Code:304 Not Modified

Response Head
ETag:"578ba64c-7ddf"
Last-Modified:Sun, 17 Jul 2016 15:37:48 GMT

Request Head
If-Modified-Since:Sun, 17 Jul 2016 15:37:48 GMT
If-None-Match:"578ba64c-7ddf"
http_cache.png

200 or 304

在没有设置Cache-Contral的情况下,设置Last-Modified和ETag缓存,会出现200(from cache)和304 交替出现的情况

设置Cache-Contral的情况下,过期刷新会出现304(如果有更新内容,则是200),之后再过期之前刷新都是200(from cache)。如果要确保要向服务端确认,可以将Cache-Contral的max-age设置为0。

chrome 测试 刷新 和 输入URL回车 测试并不会影响200(from cache)和304 的出现

缓存方案

较长的过期时间,节省带宽,提高性能;更改资源的网址,强制用户下载新响应

http-cache-hierarchy.png

按需更新,精确的缓存控制

静态资源CDN部署

更资源发布路径实现非覆盖式发布(多版本共存)

更多资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:浏览器缓存知识小结及应用 阅读目录 1. 浏览器缓存基本认识 2. 强缓存的原理 3. 强缓存的管理 4. ...
    meng_philip123阅读 1,098评论 4 18
  • 浏览器缓存,也就是客户端缓存,既是网页性能优化里面静态资源相关优化的一大利器,也是无数web开发人员在工作过程不可...
    单纯的土豆阅读 416评论 0 1
  • 浏览器缓存,也就是客户端缓存,既是网页性能优化里面静态资源相关优化的一大利器,也是无数web开发人员在工作过程不可...
    Www刘阅读 574评论 0 1
  • 缓存一直是前端优化的主战场, 利用好缓存就成功了一半. 本篇从http请求和响应的头域入手, 让你对浏览器缓存有个...
    易斯大大阅读 833评论 0 1
  • Web缓存分为很多种,比如数据库缓存,代理服务器缓存,还有我们熟悉的CDN缓存,以及浏览器缓存。 缓存的重要性不用...
    张歆琳阅读 2,198评论 5 39