PC端浏览器使用Http协议缓存
浏览器缓存(客户端缓存),它分为强缓存和协商缓存。
强缓存
浏览器在加载资源时,先根据资源http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。
强缓存是利用Expires或者Cache-Control这两个http response header实现的,它们都用来表示资源在客户端缓存的有效期。
Expires
Expires是http1.0提出的一个表示资源过期时间的header,它描述的是一个绝对时间,由服务器返回,用GMT格式的字符串表示,如:Expires:Thu, 31 Dec 2037 23:55:55 GMT,它的缓存原理是:
1 . 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Expires的header;
2 . 浏览器在接收到这个资源后,会把这个资源连同所有response header一起缓存下来;
3 . 浏览器再次请求这个资源时,先从缓存中寻找,找到这个资源后,拿出它的Expires跟当前的请求时间比较,如果请求时间在Expires指定的时间之前,就能命中缓存,否则就不行;
4 . 如果缓存没有命中,浏览器直接从服务器加载资源时,Expires Header在重新加载的时候会被更新;
Cache-Control
Expires是较老的强缓存管理header,由于它是服务器返回的一个绝对时间,在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改下客户端时间,就能影响缓存命中的结果。所以在http1.1的时候,提出了一个新的header,就是Cache-Control,这是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示,如:Cache-Control:max-age=315360000,它的缓存原理与Expires相似。
协商缓存
当强缓存没有命中缓存时,浏览器一定会发送一个请求到服务器,通过服务器端依据资源的另外的http header验证这个资源是否命中协商缓存,如果协商缓存命中,服务器会将这个请求返回,但是不会返回这个资源的数据,而是告诉客户端可以直接从缓存中加载这个资源,于是浏览器就又会从自己的缓存中去加载这个资源。
协商缓存跟强缓存不一样,强缓存不发请求到服务器,所以有时候资源更新了都在本地,但是协商缓存会发请求到服务器,所以资源是否更新,服务器肯定知道。大部分web服务器都默认开启协商缓存,而且是同时启用(Last-Modified,If-Modified-Since) 和 (ETag、If-None-Match)。
Last-Modified,If-Modified-Since
1 . 浏览器第一次跟服务器请求资源时,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间。
2 . 浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值。
3 . 服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since与服务器上的最后修改时间判断,如果没有变化则返回304 Not Modified(不会返回资源内容,header也不会改变);如果有变化,就正常返回资源内容。
4 . 浏览器收到304的响应后,就会从缓存中加载资源。(没有命中,浏览器直接从服务器加载资源,Header在重新加载更新)
(Last-Modified,If-Modified-Since)根据服务器时间返回的header,一般来说,在没有调整服务器时间和篡改客户端缓存的情况下,这两个header配合是非常可靠的,但是有时候也会服务器上资源其实有变化,但是最后修改时间却没有变化的情况,而这种问题又很不容易被定位出来,而当这种情况出现的时候,就会影响协商缓存的可靠性。所以就有了另外一对header来管理协商缓存,这对header就是(ETag、If-None-Match)。
ETag、If-None-Match
1 . 览器第一次跟服务器请求资源,服务器在返回这个资源的同时,在respone的header加上ETag的header,这个header是服务器根据当前请求的资源生成的一个唯一标识,这个唯一标识是一个字符串,只要资源有变化这个串就不同,跟最后修改时间没有关系.
2 . 浏览器再次跟服务器请求这个资源时,在request的header上加上If-None-Match的header,这个header的值就是上一次请求时返回的ETag的值.
3 . 服务器再次收到资源请求时,根据浏览器传过来If-None-Match和然后再根据资源生成一个新的ETag,如果这两个值相同就说明资源没有变化,否则就是有变化;如果没有变化则返回304 Not Modified,如果有变化,就正常返回资源内容。与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化.
4 . 浏览器收到304的响应后,就会从缓存中加载资源。
-
-
-
-
-
-
-
-
-
-
-
-
---------------------last line for now---------------------