HTTP 缓存策略

强制缓存(强缓存) 内容协商(弱缓存)
HTTP 1.1 Cache-Control: max-age=3600 Etag: ABC If-None-Match: ABC 响应状态码:304 或 200
HTTP 1.0 Expires: Wed, 21 Oct 2015 02:30:00 GMT Last-Modified: Wed, 21 Oct 2015 01:00:00 GMT If-Modified-Since: Wed, 21 Oct 2015 01:00:00 GMT 响应状态码:304 或 200

HTTP 缓存策略分为强制缓存协商缓存

强制缓存是服务器给响应头添加一个过期时间,在这个时间内浏览器直接使用缓存数据,不向服务器发送请求

  • 在 HTTP 1.0 中,这个过期时间字段是 Expires,形式是日期,缺点是如果本地系统时间不准确就失效了
  • 在 HTTP 1.1 中,指定强制缓存的字段是 Cache-Control, 其中 max-age 指定多少秒后过期,no-store 不缓存,no-cache 缓存但验证,public 公开缓存,可以被任何中间代理缓存,private 私有缓存,不能被代理服务器缓存

协商缓存是浏览器在发送请求时,带上资源的特征标记,由服务器验证,如果可以继续使用缓存则返回状态码304, 否则返回状态码200和新的资源

  • 在 HTTP 1.0 中,响应头中的特征标记是 last modifed, 即资源的最近修改时间,当向服务器发送请求时,请求头中的 If-Modified-Since 字段就携带这个时间由服务器验证,缺点是这个时间只能精确到秒,如果是1秒内文件修改了2次或多次则判断不出来
  • 在 HTTP 1.1 中,响应头中的特征标记是 Etag, 是资源的唯一标识,当向服务器发送请求时,请求头中的 If-None-Match 字段就携带这个标识信息由服务器验证是否能继续使用

页面刷新对缓存的影响

  • 正常操作: 地址栏输入url, 跳转链接,前进后退 —— 强制缓存有效,协商缓存有效
  • 手动刷新: F5, 点击刷新按钮,右键菜单刷新 —— 强制缓存失效,协商缓存有效
  • 强制刷新: ctrl+F5 —— 强制缓存失效,协商缓存失效