客户端缓存过程
- 首次请求时,服务器返回资源,并在响应头中注明缓存参数,客户端缓存资源
- 再次请求时,会先访问浏览器缓存,若命中强缓存则直接提取资源,状态码返回 200
- 若未命中强缓存,则将请求发送给服务器,判断本地协商缓存是否失效,若有效则返回状态码 304
- 若未命中协商缓存,则服务器返回完整资源,并更新缓存
强缓存
缓存由响应头中的 Expires 或 Cache-Control 两个字段控制,表示缓存有效期
- Expires(http1.0提出)
表示缓存到期时间,Expires时间与本地时间对比。
缺点是若客户端和服务端时间不一致会导致缓存更新不及时,如果修改本地时间,会产生问题。
- Cache-Control(http1.1提出)
解决了 Expires 产生问题,是替代品。
no-cache — 文件会缓存,不会强缓存,但是会进行协商缓存
no-store — 不使用缓存,每次都重新请求资源
max-age — 缓存有效时长,相对时间,单位是 s
public / private — public: 代理服务器和浏览器都会缓存,private: 浏览器缓存,默认为 private
must-revalidate — 每次访问需缓存校验
1)初次请求,服务端返回资源和 Cache-Control
2)浏览器再次请求,先访问浏览器缓存,若命中强缓存则直接获取本地缓存
协商缓存
未命中强缓存时,需访问服务器确认当前浏览器的缓存是否过期,若未过期则直接读取,返回 304
未命中情况:no-cache,max-age=0,max-age时间过期
- Last-Modify/If-Modify-Since(http1.0提出)
last-modified 表示最后修改时间
服务器与该资源的最后修改时间来确定是否使用缓存
1)初次请求,服务端返回资源和Last-Modify
2)浏览器再次请求,会在Request Headers中带着If-Modify-Since
3)资源未修改时,服务端返回304
4)资源修改了,返回新的资源和新的Last-Modify
缺点是单位是秒,如果资源以毫秒变化,无法更新;以时间戳进行比较,然后有编辑但是没有修改的内容,也会进行更新。
- Etag/If-None-Match(http1.1提出)
last-modified 的补充方法
Etag 的值是根据内容资源计算出来的的哈希字符串,当内容有变化时 Etag 就会变化。
1)初次请求,服务端返回资源和Etag
2)浏览器再次请求,会在Request Headers中带着If-None-Match
3)资源未修改时,服务端返回304
4)资源修改了,返回新的资源和新的Etag
缺点是当资源过大时,生成会消耗性能。
若资源未过期,则返回 304 表示资源未修改
若资源已过期,则返回 200 并附上最新资源以及新的 last-modified
刷新操作对缓存的影响
- 正常操作:强制缓存有效,协商缓存有效
- 手动刷新(F5,刷新按钮):强制缓存失效,协商缓存有效
- 强制刷新(ctrl+F5):强制缓存失效,协商缓存失效