浏览器缓存协商
- last-modified:根据last-modified作为时间点,发起if-modified-since,询问server在此之后有没有修改,若有304,否则200
- etag指纹: 同时存在Etag和Last-Modified的时候,Etag优先。发起if-none-match,比对etag是否一致,若一致304,否则200。
expires: 首次访问,server缓存过期时间n,n之内的时间,不发请求,直接启用缓存,n之外,走1,2流程
优先级:expires -> etag -> last-modified
没有缓存,返回200
浏览器缓存刷新:
- 在地址栏中输入网址后按回车或点击转到按钮
浏览器会对所有没有过期的内容直接使用本地缓存,这个时候Last-Modified、Etag、和Expires均不会受刷新的影响 - 按F5或浏览器刷新按钮
浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存(Expires无效)。这个时候Last-Modified、ETag就要受影响,要发起缓存协商的动作 - 按Ctrl+F5或按Ctrl并点击刷新按钮
这种方式就是我们说的强制刷新,每次浏览器都发起一个全新的请求,不使用任何缓存
浏览器缓存过期
- 设置版本号参数,ex:app.js -> app.js?20180626,这样浏览器再解析这个url的时候,就会认为这个是一个新的文件,会重新获取并不会使用浏览器本地缓存
- 改变文件名,类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