Http缓存

99 阅读2分钟

缓存

  • 作用:使网页打开速度更快,减小服务器压力。
  • 问题:当服务器资源更新后,缓存无法及时拿到服务器新的资源。
  • 解决办法:缓存设置过期时间
  • 缓存策略:强缓存 + 协商缓存

强缓存

强缓存:就是在缓存没有过期的时候,浏览器可以直接决定使用缓存。

Expires

expires它的值就是一个过期时间,浏览器拿到这个时间值以后,就可以决定缓存有没有过期。

  1. 浏览器发起请求
  2. 服务器返回资源,并在响应头里新增expires字段
  3. 浏览器再次发起请求,判断缓存有没有过期,没有直接请求缓存,缓存返回资源
  • 问题:Expires时间是服务端时间,比对的却是客户端时间,可能存在服务端和客户端时间不一致问题。

Cache-Control

在HTTP1.1引入的,跟Expires的作用是一致的,不同的是,Cache-Control采用的是过期时长。

  • max-age: 单位是秒;过期时长
  • no-cache 不使用强缓存
  • no-store 禁止缓存
  • private 只有浏览器可以缓存
  • public 浏览器、服务器、代理服务器都可以缓存

流程:

  1. 浏览器发起请求
  2. 服务器返回资源,并在响应头里新增cache-control字段
  3. 浏览器再次发起请求,判断缓存有没有过期,没有直接请求缓存,缓存返回资源

协商缓存

当缓存过期后,浏览器需要咨询服务器,是否可以继续使用缓存。

  • 如何实现协商的过程?

Last-Modified

Last-Modified 顾名思义就是最后修改时间

流程:

  1. 浏览器发起请求
  2. 服务器返回资源,并在响应头里新增Last-Modified字段(服务器资源的最后修改时间)
  3. 浏览器以后每次请求,都带上If-Modified-Since,值就是 Last-Modified
  4. 服务器拿到If-Modified-Since,去跟服务器当前的最后修改时间做比对,如果不过时,可以使用缓存,返回304状态,如果资源已经更新,给浏览器正常返回新的资源,返回200状态 image.png

问题 Last-Modified以秒级别记录,如果资源在1秒以内发生改变的话,last-modified是无感知的,它认为没有变化。

ETag

流程:

  1. 浏览器发起请求
  2. 服务器根据文件内容生成唯一标识,并通过相应头ETag传送给浏览器
  3. 浏览器以后每次请求,都带上If-None-Match,值就是 ETag
  4. 服务器拿到If-None-Match,去跟服务器当前的ETag做比对,如果没有变化,就是没有过时,可以使用缓存,返回304状态,如果资源已经更新,给浏览器正常返回新的资源,返回200状态 image.png