ONFUNS 学习&生活随笔

HTTP缓存相关汇总(强缓存、协商缓存)

1、强缓存:Cache-Control 、Expires

优先级 Cache-Control > Expires

Cache-Control常用设置值
  • max-age:相对时间,判断文件过期时间,单位秒。

  • no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。

  • no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。 public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。

  • private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。 Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高

    cache-control: max-age=3600, s-maxage=31536000

    代理服务器有s-maxage, 优先级 s-maxage > max-age , s-maxage未过期则请求代理服务器。注意:s-maxage仅在代理服务器中生效,客户端中只考虑max-age

Expires
  • 绝对时间的GMT格式的时间字符串,代表资源失效时间

注:强缓存命中则不会与服务器进行通信

2、协商缓存:Etag 、Last-Modified

强缓存命中失败则协商缓存生效

优先级 Etag > Last-Modified

Etag

解释:资源的唯一校验码,只有资源修改后值才会变化

服务器根据浏览器上Request Headers的If-None-Match值来判断是否命中缓存。

服务器返回304 Not Modified的响应时,由于ETag重新生成过,Response Headers中还会把这个ETag返回,即使这个ETag跟之前的没有变化。

Last-Modified

解释:资源的最后修改时间

第一次请求资源时服务器返回的Response Headers中会加上Last-Modified,浏览器再次请求该资源Request Headers携带If-Modified-Since(该值为之前返回的Last-Modified),服务器收到If-Modify-Since,根据资源的最后修改时间判断是否命中缓存

注:服务器会优先验证ETag,一致的情况下,继续比对Last-Modified如相等返回304否则重新请求

流程图: