什么是缓存协商
服务端的动态内容缓存包括缓存内容的创建、存储和过期检查一些列过程,然后对于浏览器缓存,缓存内容存储在浏览器本地,而内容由服务端生成,任何一方无法独立完成这一系列过程,因此他们之间必须有一种沟通机制,这就是http的缓存协商
怎么协商
①服务端必须告诉浏览器哪些内容可以被缓存,这样浏览器再请求这个内容时便不会直接向服务器请求完整内容,而是询问服务器状态有无变化,是否可以使用本地缓存
②浏览器只需要关心HTTP请求头中是否包含缓存协商信息(一般协商缓存针对get请求,post请求一般不用本地缓存)
Last-Modified协商方法
服务端需要在响应头中带上Last-Modified,然后给定GMT时间,代表上次修改时间。
此时浏览器再发出请求,可以在请求头中看到If-Modified-Sicnce ,这意味着浏览器在询问服务器,请求的内容是否在上次修改时间之后有更新,此时服务器需要检查这个内容在该时间后有无更新,这个过程就是缓存过期检查。
304状态码
304Not Modified意味着服务器告诉浏览器这个内容没有更新,浏览器可以使用本地缓存的内容。
ETag协商方法
HTTP/1.1支持另一种缓存协商ETag。这种方法采取一串编码来标记内容,这串编码称为ETag,如果这个编码没发生变化说明内容没更新。ETag由服务器生成,浏览器在第一次请求后获取这个ETag下次请求在请求头中携带来询问服务器该内容是否有变化,然后服务器重新计算该值,如果ETag相同则返回304状态码,否则将最新内容和新的ETag返回给浏览器。
基于最后修改时间缓存协商的缺点
①有时候有一些文件需要频繁更新,但内容可能不变,但是每次文件修改时间变化后,不论内容是否变化,浏览器都会重新获取全部内容
②当服务器使用负载均衡配置了堕胎服务器,这样这些服务器的最后修改时间很难保证完全相同,也会导致客户端重新获取全部内容