http缓存知识还是挺多的, Cache-Control,expires,etag,Last-Modified等一大堆,如果不组织成知识网络,将后患无穷
这里有两篇文章写的很好 my.oschina.net/u/4638235/b… 和 segmentfault.com/a/119000002… ,建议先看前面的再看后面的。
这里做个总结
区分请求头,响应头,值
请求头:
If-None-Match:33a64df551425fcc55e4d42a148795d9f25f89d4可以理解为资源内容对应的唯一hash值If-Match:33a64df551425fcc55e4d42a148795d9f25f89d4可以理解为资源内容对应的唯一hash值If-Unmodified-Since:Mon,18 Oct 2066 23:59:59 GMTIf-Modified-Since:Mon,18 Oct 2066 23:59:59 GMT
响应头:
etag:33a64df551425fcc55e4d42a148795d9f25f89d4可以理解为资源内容对应的唯一hash值Last-Modified:Mon,18 Oct 2066 23:59:59 GMTexpires:Mon,18 Oct 2066 23:59:59 GMTCache-Control:max-age=数字、immutable、no-cache等,max-age=0与no-cache基本等价
缓存分类
协商缓存
与服务器协商是否要缓存
注:表面是本地缓存,实际上也是需要发起请求的
etag+If-None-Match/If-Match
需要向服务器请求当前etag值,判断内容hash值是否一致,再去决定是否缓存
If-None-Match : 字面意思,如果不匹配,则重新请求,其他If-开头的同理
Last-Modified+If-Modified-Since/If-Unmodified-Since
根据资源的最后修改时间是否一致,来判断是否要缓存
对比 1 和 2 :
etag和Last-Modified往往作用一致,但Last-Modified单位是秒,如果资源更新速度达到毫秒级别,就只能使用etag了
强行缓存
expires
设置过期时间
Cache-Control: max-age=数字
效果与expires一致
Cache-Control: immutable
只有部分浏览器才支持,而且他的作用是永远缓存,所以不推荐使用
优先级
Cache-Control > expires > Last-Modified > Etag
只有前面一级的判断失效,才会进行下一级的判断。
何为判断失效?判断不出需要缓存,即为判断失效。