http缓存总结

141 阅读2分钟

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 GMT
  • If-Modified-Since: Mon,18 Oct 2066 23:59:59 GMT

响应头:

  • etag : 33a64df551425fcc55e4d42a148795d9f25f89d4 可以理解为资源内容对应的唯一hash值
  • Last-Modified: Mon,18 Oct 2066 23:59:59 GMT
  • expires : Mon,18 Oct 2066 23:59:59 GMT
  • Cache-Control : max-age=数字immutableno-cache 等,max-age=0no-cache基本等价

缓存分类

协商缓存

与服务器协商是否要缓存

注:表面是本地缓存,实际上也是需要发起请求的

  1. etag + If-None-Match/If-Match

需要向服务器请求当前etag值,判断内容hash值是否一致,再去决定是否缓存

If-None-Match : 字面意思,如果不匹配,则重新请求,其他If-开头的同理

  1. Last-Modified + If-Modified-Since/If-Unmodified-Since

根据资源的最后修改时间是否一致,来判断是否要缓存

对比 1 和 2 :

etagLast-Modified往往作用一致,但Last-Modified单位是秒,如果资源更新速度达到毫秒级别,就只能使用etag了

强行缓存

  1. expires

设置过期时间

  1. Cache-Control: max-age=数字

效果与expires一致

  1. Cache-Control: immutable

只有部分浏览器才支持,而且他的作用是永远缓存,所以不推荐使用

优先级

Cache-Control > expires > Last-Modified > Etag

只有前面一级的判断失效,才会进行下一级的判断。

何为判断失效?判断不出需要缓存,即为判断失效。