1.强缓存(Expires和Cache-Control)
a.强缓存是浏览器直接从本地缓存中加载资源,而不发送请求到服务器。
i.Expires头部: 服务器响应时,通过设置Expires头部指定资源的到期时间,浏览器会在到期时间之前直接从缓存加载资源。这个时间是资源到期的绝对时间,由服务器返回。
ii.Cache-Control头部: Cache-Control头部提供了更加灵活和景区的缓存控制,可以通过设置max-age指令来制定资源缓存的最大时间(秒)。例如,Cache-Control: max-age=3600
表示资源将在3600秒后过期
2.协商缓存(Last-Modified和ETag)
a.协商缓存是浏览器在本地缓存中储存资源的验证表示(通常是最后修改时间或者实体标签),在下次请求资源师,浏览器会发送一个条件请求到服务器,通过验证表示检查资源是否已经被修改,从而决定是否使用缓存的资源。
i.Last-Modified和If-Modified-Since头部: 服务器响应时,通过设置Last-Modified头部指定资源的最后修改时间。浏览器在后续请求时会发送If-Modified-Since头部,如果资源在此时间之后未发生改变,服务器会返回304 Not Modified状态码,告诉浏览器可以使用缓存的资源
ii.ETag和If-None-Match头部: 服务器响应时,通过设置ETag头部提供资源的实体标签。浏览器在后续请求时会发送If-None-Match头部,如果资源的实体标签未发生改变,服务器会返回304 Not Modified状态码。
备注:选择缓存策略
1.强缓存通常优先于协商缓存,因为它不需要服务器的验证,直接从本地获取资源。这对于静态资源或者不经常更新的资源非常有效
2.协商缓存在资源更新时更具灵活性,它依赖于服务器的验证,可以确保客户端获取到的是最新版的资源。经常用于更新的资源或者需要动态生成的资源。
部署前端 (html 协商 css之类 强缓存 覆盖式更新可以通过上cdn的方式解决)
注:
- Cache-Control 并不是专门用于强缓存,它可能作用于浏览器、代理服务器或者任何中间服务,它本身标识了内容的可缓存性质。Expires作用类似,但已经被废弃。目前能精准控制的强缓存是利用Cache API和Service worker实现的,上一代的技术App manifest也能做到,但已经被废弃
- 现代架构中,静态资源一般不会直接部署到CDN边缘节点上,而是部署在源站,边缘节点按需拉取,有些大型的CDN网络还会有分层缓存。