缓存分为强缓存和协商缓存
浏览器在请求某次资源时,会先获取该资源缓存的请求头信息, 然后根据header中的Cache-Control和Expires来判断是否过期。
若没过期则直接从缓存中获取资源信息,包括缓存的header信息,因此此次请求不会与服务器进行通信。如果显示已经过期,浏览器会向服务器端发送请求,这个请求会携带第一次请求返回的有关缓存的header字段信息,比如客户端会通过If-None-Match头将先前服务器端发送过来的Etag发送给服务器,服务器会对比这个客户端发过来的Etag是否与服务器相同,如果相同,就将If-None-Match 的值设为false,返回304状态码,客户端继续使用本地缓存,不解析服务器返回的数据;若不相同就将If-None-Match 的值设为true 返回状态为200, 客户端会重新解析服务端返回的数据;客户端还会通过If-Modified-Since头将先前服务器端发送过来的最后修改时间戳发送给服务器,服务端通过这个时间戳判断客户端页面是否是最新的,如果不是最新的,则返回最新的,如果是最新的则返回304,客户端继续使用本地缓存。强缓存:强缓存是利用http头中的Expires和Cache-Control 两个字段控制,用来表示资源缓存时间。强缓存中,普通刷新会忽略它,但不会清除它。强制刷新会清除它,请求会带上Cache-Control: no-cache和Pragma:no-cache;
Expires: Expires是http1.0的规范,它是一个绝对时间的GMT格式的时间字符串,这个时间代表资源的失效时间,只要发送请求时间是在Expires之前,那么本地缓存一直有效,则在缓存中读取数据。这种方式有一个明显的缺点,由于失效时间是一个绝对的时间。当客户端时间和服务器时间的时间偏差较大时,就会导致缓存混乱。 如果同时出现 Cache-Control:max-age和Expires,那么max-age优先级更高,过期时间会按照max-age为准。
Cache-control:Cache-control是在http1.1中出现的,只要利用该字段的max-age值来进行判断,他是一个相对时间。代表着资源的有效期。出来max-age还有下面几个常用的设置值:
no-cache: 不使用本地缓存,使用协商缓存。no-store:直接禁止浏览器缓存数据,每次请求都会向服务器发送一个请求,每次都会下载完整的资源。public:可以被所有用户缓存。包括终端用户和cdn等中间代理服务器private:只能被终端用户的浏览器缓存,不允许cdn等中继缓存服务器对其缓存。Cache-Control与Expires可以在服务端配置同时启用。同时启用是Cache-Control优先级更高。
协商缓存:协商缓存就是发个带有标识的请求给服务端,如果不需要更新,会返回304状态码,使用缓存的数据,需要更新就返回200状态码,使用服务端新返回的数据
强缓存的优先级高于协商缓存。强缓存生效直接使用强缓存,强缓存失效才会去看是否有协商缓存。