分享掘金上关于浏览器缓存机制的一篇文章 https://juejin.im/post/59c602276fb9a00a3d135f2e
常见的 HTTP 缓存只能存储 GET
响应
HTTP/1.1定义的 Cache-Control
头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。
cache-control:no-cache/no-store/must-revalidate/max-age
驱逐算法:
用于将陈旧的资源(缓存副本)替换为新鲜的。一个陈旧的资源(缓存副本)是不会直接被清除或忽略的,当客户端发起一个请求时,缓存检索到已有一个对应的陈旧资源(缓存副本),则缓存会先将此请求附加一个
If-None-Match头,然后
发给目标服务器,以此来检查该资源副本是否是依然还是算新鲜的,若服务器返回了304
(Not Modified)(该响应不会有带有实体信息),则表示此资源副本是新鲜的,这样一来,可以节省一些带宽。若服务器通过 If-None-Match 或 If-Modified-Since判断后发现已过期,那么会带有该资源的实体内容返回。
对于含有特定头信息的请求,会去计算缓存寿命。比如Cache-control: max-age=N的请求头,相应的缓存的寿命就是N。通常情况下,对于不含这个属性的请求则会去查看是否包含Expires属性,通过比较Expires的值和头里面Date属性的值来判断是否缓存还有效。
Last-Modified:一种弱校验器
如果max-age和expires属性都没有,找找头里的Last-Modified信息。如果有,缓存的寿命就等于头里面Date的值减去Last-Modified的值除以10。
说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上
If-Modified-Since
来验证缓存。
Etags:缓存的一种强校验器
如果资源请求的响应头里含有ETag, 客户端可以在后续的请求的头中带上
If-None-Match
头来验证缓存。
缓存校验:
当向服务端发起缓存校验的请求时,服务端会返回
200
ok表示返回正常的结果或者304
Not Modified(不返回body)表示浏览器可以使用本地缓存文件。304的响应头也可以同时更新缓存文档的过期时间。