浏览器存在一个缓存数据库,存储缓存信息,在客户端第一次发送请求时,此时缓存数据库中没有对应的缓存数据,需要请求服务器,服务器返回后,将数据缓存至缓存服务器中,HTTP根据是否重新向服务器发送请求分类,有两种缓存机制:强制缓存和对比缓存。
相对于强制缓存下,请求数据时,直接请求缓存服务器,若存在缓存数据,则直接读取缓存服务器中数据,若没有,则请求服务器,后返回请求数据和缓存机制,后将数据和缓存机制存入缓存数据库。
相对于对比缓存下,一般是基于存在缓存数据的情况下,首先先从缓存数据中获取缓存标识,后请求服务器验证缓存标识对应数据是否失效,若未失效,则从缓存服务器中获取缓存数据,若失效,则从服务器获取最新数据和缓存规则,后将缓存规则存入缓存数据库中。
对于强制缓存,响应头有两个字段来标明:Expires/cache-control。
Expires为服务器返回的截止时间,若下次请求时,请求时间小于服务器截止时间,则直接返回数据。但由于它制定的是实际的过期日期而不是秒数。会有误差,一般使用cache-control
cache-control常见规则分为private,public,max-age,no-store.默认为private.
max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间 开始到过期时间之间的秒数。
s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
private: 客户端可以缓存
public:客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的
no-cache: 需要使用对比缓存来验证缓存数据。
must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据。
proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用
对比缓存有两种缓存标识:Last-Modified/If-Modified-Since和Etag/If-None-Match(优先级高于前者)
Last-Modified:服务器在响应请求时,告诉浏览器资源的最后修改时间。为服务器的响应头。
If-Modified-Since:为客户端的请求头。再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200;若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
Etag/If-None-Match(优先级高于Last-Modified/If-Modified-Since)
Etag:服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)(服务器生成的响应头)
总结浏览器请求,cache-control优先级高于Etag.