浏览器缓存协商

浏览器缓存协商

  1. last-modified:根据last-modified作为时间点,发起if-modified-since,询问server在此之后有没有修改,若有304,否则200
  2. etag指纹: 同时存在Etag和Last-Modified的时候,Etag优先。发起if-none-match,比对etag是否一致,若一致304,否则200。
  3. expires: 首次访问,server缓存过期时间n,n之内的时间,不发请求,直接启用缓存,n之外,走1,2流程

    优先级:expires -> etag -> last-modified
    没有缓存,返回200

浏览器缓存刷新:

  1. 在地址栏中输入网址后按回车或点击转到按钮
    浏览器会对所有没有过期的内容直接使用本地缓存,这个时候Last-Modified、Etag、和Expires均不会受刷新的影响
  2. 按F5或浏览器刷新按钮
    浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存(Expires无效)。这个时候Last-Modified、ETag就要受影响,要发起缓存协商的动作
  3. 按Ctrl+F5或按Ctrl并点击刷新按钮
    这种方式就是我们说的强制刷新,每次浏览器都发起一个全新的请求,不使用任何缓存

浏览器缓存过期

  1. 设置版本号参数,ex:app.js -> app.js?20180626,这样浏览器再解析这个url的时候,就会认为这个是一个新的文件,会重新获取并不会使用浏览器本地缓存
  2. 改变文件名,类webpack添加hash

关于缓存命中的疑惑

浏览器按照http method和URI作为key,method仅是get,所以URI是主要的依据
所以,以下URI将会分别缓存
URI 1: www.xxx.com/AAA/index.js
URI 2: www.xxx.com/BBB/index.js