Fork me on GitHub

Http缓存优先级问题

HTTP缓存分为强缓存和对比缓存(也叫协商缓存)。

强缓存

强缓存:只要请求了一次,在有效时间内,不会再请求服务器(请求都不会发起),直接从浏览器本地缓存中获取资源。

主要字段有

  1. expires:date(过期日期)
  2. cache-control: max-age=time(秒数,多久之后过期) | no-cache|no-store

如果expires和cache-control同时存在,cache-control会覆盖expires。

这里建议两个都写,cache-control是 Http 1.1 的头字段,expires是 Http 1.0 的头字段,都写的话兼容会好点。

对比缓存

对比缓存:无论是否变化,是否过期都会发起请求,如果内容没过期,直接返回304,从浏览器缓存中拉取文件,否则直接返回更新后的内容。

主要字段有

  1. 服务器端返回字段 Etag: xxxx (一般为md5值) 其对应客户端匹配字段为, If-None-Match: w/xxx(xxx的值和上面的etag的xxx一样的话则返回304,否则返回200以及修改后的资源)
  2. 服务器端返回字段:Last-Modifieddate(日期),对应客户端匹配字段If-Modified-Since:date(如果服务器date小于等于客户端请求date则返回304,否则返回200以及修改后的资源)

优先级

同时存在各种缓存头时,各缓存头优先级及生效情况为:

  1. 强缓存和对比缓存同时存在,如果强缓存还在生效期则强制缓存覆盖对比缓存,对比缓存不生效;如果强缓存不在有效期,对比缓存生效。即:强缓存优先级 > 对比缓存优先级
  2. 强缓存expires和cache-control同时存在时,则cache-control会覆盖expires,expires无论有没有过期,都无效。 即:cache-control优先级 > expires优先级。
  3. 对比缓存Etag和Last-Modified同时存在时,则Etag会覆盖Last-Modified,Last-Modified不会生效。即:ETag优先级 > Last-Modified优先级。
扫描二维码,拯救贫困山区大学生!
-------------本文结束感谢您的阅读-------------