HTTP 缓存分为强缓存和协商缓存
[TOC]
header 属性 | 可选值 | 优先级 | 优选点 |
---|---|---|---|
Pragma(HTTP/1.0) | no-cache: 不直接使用缓存,根据新鲜度来使用缓存 | 高 | 1.响应头不支持这个属性 2.为了兼容 HTTP/1.0 的客户端 3.在 HTTP 1.1 中已被废弃 |
Cache-Control(HTTP/1.1) | 1.no-cache: 不直接使用缓存,根据新鲜度来使用缓存 2.no-store: 不使用缓存,每次都是请求下载新资源 3.max-age: xx 秒, 缓存时长 4.public/private: 是否只能被单个用户使用,默认为 private 5.must-revalidate: 每次访问需要缓存校验 |
中 | 1.请求头和响应头都支持这个属性 2.不适用于 HTTP/1.0 3.在缓存未失效前,获取不到修改后的资源 |
Expires(HTTP/1.0+) | GMT 时间( Sat, 19 May 2018 17:17:24 GMT) | 低 | 1.服务器和客户端的时间不一致会出问题 2.适用于 HTTP/1.0 和 HTTP1.1 3.在缓存未失效前,获取不到修改后的资源 |
缓存校验有:Expires,Last-Modified,E-Tag
chrome 浏览器中返回的 200 状态会有两种状态:
当第一次请求时,服务器返回的响应头中没有 Cache-Control 和 Expires 或者 Cache-Control 和 Expires 过期,再或者不走强缓存,那么浏览器第二次请求时就会与服务器进行协商,与服务器端对比判断资源是否进行了修改更新。
跟协商缓存相关的 header 头属性有 ETag/If-None-Match、Last-Modified/If-Modified-Since 响应头和请求头需要成对出现
header 属性 | 可选值 | 优先级 | 优选点 |
---|---|---|---|
If-None-Match / ETag | 校验值(一般为一个 hash 值) | 高 | 1.默认使用 hash 算法,在分布式环境中可能出现不同服务器生成的 ETag 值不一致 2.计算 ETag 需要性能消耗 3.精确的判断资源有无被修改,可识别一秒内的修改次数 |
If-Modified-Since/Last-Modified | GMT 时间 | 低 | 1.只要资源修改,无论内容有无变化,都会将资源返回客户端 2.以时刻为标识,无法获取一秒内的修改变化 3.某些服务器不能准确获取最后的修改时间 |
强缓存情况下,只要缓存还没过期,就会直接从缓存中取数据,就算服务器有数据变化,也不会从服务器端获取,这样就无法获取到修改后的数据。解决的方法修改资源的 url
尽量减少 304 的请求,协商缓存每次都会与后台服务器进行交互,因此性能不是很好
在 Firefox 浏览器下,使用 Cache-Control: no-cache 是不生效的,其识别的是 no-store,因此一般使用 Cache-Control: no-cache, no-store
与缓存相关的 header 属性: Vary、Date/Age
Vary: 表示服务端会以什么基准字段来区分、筛选缓存版本
Date/Age: 响应报文中的 Date 和 Age 字段,区分其收到的资源是否命中了代理服务器的缓存