1. 浏览器端强制缓存,http响应头expires 和 cache-control 是设置缓存的重要参数
  • expires 设置到期时间点,这是http1.0的产物,对于客户端时间和服务器端有时差的情况,会导致缓存失效,或者缓存时间变长。
  • cache-control 设置多久以后过期,http1.1的的优化版本,解决了时差的问题,建议用这个。
  • 目前的浏览器两个参数都是生效的,那个先过期那个生效,建议只使用cache-control
  • 强制缓存有请求记录,但是不会真实的发送请求,响应结果直接是200.
  • 这种固定缓存时间适合那些几乎永远不会变动的资源。如果有一定变动的不适合。
  1. 浏览器端协商缓存,由响应头ETag 和 Last-Modified控制
  • 第一次请求资源的时候服务器响应头返回这两个参数,ETag是资源None值,一般是文件hash,Last-Modified是最后一次修改时间
  • 第二次请求的时候浏览器端默认在If-None-Match 和 If-Modified-Since,带上ETag和Last-Modified,然后由服务端程序比对这两个值是否变动。
  • 服务端比对过程,If-Modified-Since如果和后端最后一次修改时间不相等那就文件一定被改过,如果相等可能是一个时间精度内改了多次,所以要比对资源的none值。如果还一样,服务器端认为客户端是最新资源,返回304和空的响应体,浏览器就会去读取本地缓存。如果比对不上,那么就正常返回服务器资源,状态码200.
  • 协商缓存适用于需要前端缓存,但是有一定变动可能的资源。
  1. 客户端发起请求的时候,可以通过请求头,决定是否要走缓存。
  • no-cache:带了这个请求头的请求不在走强制缓存,但是还可以走协商缓存。
  • no-store:带了这个请求的不走强制缓存和协商缓存,相当于这个请求禁用缓存。