浏览器缓存学习笔记

简介

浏览器是存在缓存的,一般会在用户的文件系统中创建一个目录用于存放缓存文件,其目的是减少服务器端的网络开销,提高用户访问速度。这种缓存主要分两种:

1、需要和服务器交互(缓存协商),比如Last-Modified和ETag;

2、不需要和服务器交互,比如Expires和Cache-Control.

Last-Modified

Last-Modified的原理是服务器向浏览器返回一个最后修改时间,浏览器下次请求时询问服务器在这个时间之后是否有更新,服务器获取到文件的最后修改时间反馈给浏览器。一般将Last-Modified与If-Modified-Since配合使用。可以用httpWatch观察响应状态码,如果为304 Not Modified意味着这个内容没有更新,浏览器可以使用本地缓存的内容,同时,服务器不会将内容的正文传给浏览器;如果为200 OK,则需要重新请求动态内容。

对于静态文件很容易获取最后修改时间,对于动态内容,web服务器无能为力,需要动态程序来完成,然后告诉web服务器。

Last-Modified在以下场合不适用:

1、有些时候虽然文件频繁更新,但文件内容没有更新;

2、同一个文件在多个服务器上都有副本,实现负载均衡,这些文件的修改时间未必都相同;

3、修改时间不愿意暴露给客户端时,修改时间是敏感信息。

ETag

ETag全称为实体标签缓存验证器(Entity Tag Cache Validators),也是一种浏览器与web服务器的验证机制,只不过比Last-Modified更为灵活一些。HTTP/1.1中并没有规定ETag的具体格式,只是要一串编码即可,开发人员可以自由定义,可以是最后修改时间、也可以是请求内容的md5编码、也可以是某个hash函数的计算结果等。要配合If-None-Match来实现,具体步骤如下:

1、客户端请求一个页面;

2、服务器返回,并加上一个ETag(一串字符,类似token);

3、客户端展现该页面,并将页面连同ETag一起缓存;

4、客户再次请求这个页面,并将上次请求时服务器返回的ETag一起传递给服务器;

5、服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304 Not Modified和一个空的响应体.

注意服务器端产生ETag和校验都是需要开销的,往往比Last-Modified要大一些。开启ETag需要消耗性能,但ETag本身会减少服务器端请求,这里面需要权衡。

Expires

HTTP缓存的最终目的是要彻底消灭不必要的请求,Expires就是其中一种实现方案。它告诉浏览器该内容在何时过期,暗示浏览器在该内容过期之前不需要询问服务器,而直接使用本地缓存即可。

Expires明显比Last-Modified有更大的权力,完全可以自作主张,减少与服务器端交互,但其有一个硬伤:通过Expires指定的过期时间来自web服务器的系统时间,用户本地时间与服务器时间一般是不一致的,如果相差太多,影响到本地缓存的有效期检查。

Cache-Control

HTTP/1.1中还有一个标记Cache-Control用于弥补Expires的不足,其格式为Cache-Control:max-age=,max-age指定了缓存过期的相对时间,单位是秒。

如果HTTP响应头中同时含有Expires和Cache-Control时,浏览器会优先考虑Cache-Control,对于没有Cache-Control的情况,浏览器则会服从Expires的指示。

页面请求方式与浏览器缓存

1、转到/GO/地址栏直接请求

这种方式浏览器支持缓存协商,对没有过期的内容使用本地缓存,Expires标记在这种访问方式下也有效。

2、F5/刷新

按F5键或者点击浏览器的刷新按钮,允许Last-Modified/ETag这种与服务器协商方式利用缓存,但对Expires无效。

3、Ctrl+F5

强制刷新,不使用缓存,直接获取页面最新版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章