浏览器端HTTP的缓存机制介绍

184 阅读4分钟

HTTP缓存机制作为 web 性能优化的重要手段,对于从事 web 开发者来说,应该是知识体系库中的一个基础且重要的环节,同时对于有追求的前端来说也是必备的知识技能。

1. 缓存有关的HTTP消息头

消息头消息头来源作用
Pragmano-cache响应头告诉浏览器忽略资源的缓存副本,每次访问都需要去服务器拉取【HTTP1.0中存在的字段,在HTTP1.1中被Cache-Control代替,向下兼容HTTP协议是需要携带】
ExpiresMon Jan 10 2022 11:07:34 GMT响应头启用缓存和定义缓存时间。告诉浏览器资源缓存过期时间点,如果未过期浏览器将不会发起请求【HTTP1.0中存在的字段,该字段所定义的缓存过期时间由服务器定义,如果客户端时间跟服务器时间不一致,将会导致过期时间误差,在HTTP1.1中被Cache-Control代替】
Cache-Controlno-cache响应头告知浏览器忽略资源的缓存副本,强制每次请求直接发送给服务器,拉取资源,但不是“不缓存”
no-store响应头强制在任何情况下都不创建缓存副本
max-age=[秒]响应头指定缓存副本的有效时长,从请求时间开始到过期时间之间的秒数
public响应头任何路径的缓存者(本地缓存、代理服务器),可以无条件的缓存该资源
private响应头只针对单个用户或者实体(不同用户、窗口)缓存资源
Last-ModifiedMon Jan 10 2022 11:07:34 GMT响应头告诉浏览器这个资源最后的修改时间。【精确到秒】
If-Modified-SinceMon Jan 10 2022 11:07:34 GMT请求头为上次响应头Last-Modified值,web服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间对比,若有改动则返回新的资源,响应码:200;若最后修改的时间无变化,则告知浏览器使用缓存副本,响应码:304
ETag87e2-524b6f1077980响应头告诉浏览器当前资源在服务器的唯一标识符(生成规则由服务器决定)
If-None-Match87e2-524b6f1077980请求头为上次响应头ETag值,web服务器收到请求后发现由If-None-Match则与被请求资源的相应校验串进行对比,若有改动则返回新的资源,响应码:200;若最后修改的时间无变化,则告知浏览器使用缓存副本,响应码:304

2. 强制缓存

强制缓存就是从浏览器缓存中查找该请求的缓存标识(header中的Cache-Control和Expires)和缓存资源,根据缓存标识来决定是否直接使用该缓存资源的过程;

  • 不存在该缓存资源和缓存标识,强制缓存失效,则直接向服务器发起请求;
  • 存在该缓存资源和缓存标识,但是缓存资源已经失效(根据缓存标识判断),强制缓存失效,进入判断协商缓存阶段;
  • 存在缓存资源和缓存标识,且缓存资源未失效(根据缓存标识判断),强制缓存生效,直接返回缓存资源;

forceCache.png

3. 协商缓存

协商缓存就是强制失效后,浏览器携带缓存标识(header中的If-Modified-Since和If-None-Match)向服务器发起请求,由服务器根据缓存标识决定是否让浏览器使用缓存资源的过程;

  • 不存在缓存标识,协商缓存失效,直接向服务器请求资源,状态码200;
  • 存在缓存标识,携带缓存标识向服务器发起请求,服务器根据缓存标识判断资源是否被更改:
    • 如果被更改,则返回新的资源,状态码200;
    • 如果未更改,则让浏览器继续使用本地缓存,状态码304;

negotationCache.png