浏览器缓存浏览器缓存分为强缓存和协商缓存强缓存当客户端第一次向服务器请求某个资源时,服务器将请求的资源返回给客户端,并告诉客户端端保存这个资源在本地,如果以后某个时间点之前需要这个资源,可以直接从本地获取,不需要请求服务器。以这种方式缓存的资源称为强缓存。强缓存由HTTP返回头中的Expires(实体头字段)或Cache-Control(通用头字段)控制,用于指示资源的缓存时间。服务器通过这两个头域通知客户端资源缓存过期时间和缓存最大生存期。客户端知道资源的缓存过期时间和最大生命周期后,就可以判断是否可以直接从浏览器缓存中获取资源,而无需与服务器建立连接。注意:当命中强缓存时,浏览器也会收到status=200的响应。在Chrome中,可以通过大小来区分是服务器返回的资源还是强缓存获取的资源。(1).Expires(http1.0规范)其值为GMT格式的绝对时间字符串,代表缓存资源的过期时间,在此时间点之前,缓存被命中。缺点:服务器返回的Expires时间点是服务器上的时间,可能和客户端有时间差。如果时间差太大,可能会造成缓存混乱(2)。Cache-Control:max-age(http1.1规范)强缓存使用其max-age值来决定资源缓存的最大生命周期,其取值单位为秒。Cache-Control:max-age=3600表示资源有效期为1小时,即从第一次获取资源起1小时以内的请求才算命中强缓存。注意:Cache-Control描述的是相对时间,使用本地时间来计算资源的有效期,因此比Expires更可靠。这两个标头可以只使用其中一个,也可以一起使用。一起使用时,是根据Cache-Control来协商缓存的。当客户端第一次向服务器请求某个资源时,服务器将请求的资源抛给客户端,同时也将资源的一些信息(文件摘要,或上次修改时间)返回给客户端客户端,告诉客户端在本地缓存这个资源。当客户端下次需要这个资源时,会把请求和相关信息(文件摘要,或者最后修改时间)一起发送给服务器,服务器判断是否需要更新客户端缓存的资源:如果不需要需要更新,直接告诉客户端获取本地缓存资源即可;如果需要更新,将最新的资源连同相应的信息返回给客户端。当强缓存未命中时,浏览器会向服务器发送请求,服务器会验证是否命中了协商缓存。如果命中协商缓存,则请求返回的HTTP状态为304,并会显示NotModified的描述,浏览器收到返回后,会从缓存中加载。协商缓存由两对标头[Last-Modified,If-Modified-Since]和[ETag,If-None-Match]管理。(1).Last-Modified&If-Modified-SinceLast-Modified为实体头域,值为资源最后更新时间,随服务器响应返回。If-Modified-Since是请求的头域。通过比较两次,判断资源在两次请求过程中是否被修改过。如果没有,就会命中协商缓存,浏览器会从缓存中获取资源;如果已被修改,则服务器返回资源和新的Last-Modified时间(2)。ETag&If-None-MatchETag为对应的头域,表示资源内容的唯一标识,返回If-None-Match以服务器响应为请求头域,服务器判断资源之间是否有修改通过比较请求头中的If-None-Match和当前资源的ETag来判断两个请求。如果没有,就会命中协商缓存,浏览器会从缓存资源中获取;如果已经被修改,服务器返回资源并返回新的ETag协商缓存管理:[Last-Modified,If-Modified-Since]和[ETag,If-None-Match]一般同时启用,这用于处理Last-Modified不可靠的情况。
