HTTP缓存
学习自
https://www.cnblogs.com/chenqf/p/6386163.html
强制缓存
如何判断缓存数据是否失效?
Expires
服务器给你一个到期时间,客户端进行比对。但是有个问题,两端时间不同步。是HTTP1.0的过时产物。
Cache-Control(这个东西出现在request中还是response中颇有争议,一个问题就是,response header中指定了max age, request header中也指定了max age,有啥区别?其实response header返回了max age,就是这段时间内是可以复用缓存的。 它的沟通对象其实是我们的缓存系统。当我们再次请求的时候,我们不需要在request header中设置cache control,就可以进行 判断。如果我们在request header中就算设置了max-age呢?这个是我们想废掉这个事件段内的缓存可以做的操作。因为我们默认在max-age内就可以进行缓存的复用,但是我们客户端检测到缓存对于实际需求来说已经是有问题了,这个时候我们需要手动 指定max-age。如果max-age>0,那就是代表我们可以接受过期多久的缓存,如果max-age<=0,就是代表我们需要正式 请求服务器了,进入对比缓存阶段)
为了解决上面的弊端,需要指明max-age,代表多少时间内是可以复用的。
常见取值:
private: 客户端可以缓存(默认)
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发(对于前端开发来说,缓存越多越好,so...基本上和它说886)
对比缓存
服务端会给你一个标识,你再次请求的时候,会带着标识,然后服务端进行检查,看看是否可以复用缓存。如果可以,返回304状态码,我们可以复用缓存。和强制缓存不同之处在于,这里的比对,发生在服务端中。
response header中Last-Modified
资源最后修改时间
request header中If-Modified-Since
给服务器这个时间,如果修改过,返回200,成功请求;如果没有修改过,返回304,可以直接用缓存
response header的ETag
服务器返回资源的唯一标识
request header的If-None-Match
判断资源改变了没,和上面的修改时间原理一样,只是前者比较的是修改时间,这里是比较的是资源
当客户端没有缓存时,是这样请求的
当客户端有缓存时,是这样请求的(没过期,就是强制缓存,过期了,再进行一个比较缓存)