HTTP缓存方案

39 阅读1分钟

image.png

1.1时代:

  • 响应头里给两个东西,一个是cache,一个是Etag:
  • 在文件响应头上写Cache-control:max-age = 3600
    • 自动缓存一个小时(这一个小时内,如果有谁访问同一个url,同一个查询参数,则不发送请求)
    • Etag(特征值):假如一年缓存到期,拿着Etag去问,这个缓存能不能删除。
  • 如何去问(内容协商,在强缓存过期之后):
    • 发送这么一个请求(访问JS的时候询问现在存有的Etag能不能删):if-None-Match:ABC(浏览器向服务器发的一个询问)。
      • 如果服务器返回的是304:别删,继续用,我还没更新。
      • 如果服务器返回的是200:删了,我给你最新的。

1.0时代

  • Expires:Wed, 21 Oct 2015 02:30:00 GMT 给定一个时间,到时间后就过期,但是用户的系统时间可能是错乱的。 同样,如果过了这个时间,这个缓存要不要删掉呢?
  • 浏览器也给了一个特征值:是最后一次更新的时间Last-Modified,进行内容协商,拿着最后更新的时间问要不要删:如果要删,就返回200,如果不要删,就返回304。
  • 问题:如果一个文件在一秒钟之内改了几次呢?精度太粗了,如果一秒钟内改变了就无法区分。
  • 所以1.0时代的两个内容有bug
    • Expires的bug是用户时间可能错乱。
    • Last-Modified的bug是1秒内可能修改多次。

pragma

MDN已经明确不推荐使用。