我们观察图片的下载,往往第一次请求时200ok
第二次请求时 304 not modified 未修改状态
解释:在网络上有一些缓存服务器,浏览器自身也有缓存功能。当我们第一次访问某图片时,正常下载图片,返回值200,第二次访问时,基于一个前提--图片不会经常改动
服务器在返回200的同时,还返回该图片的签名--Etag(签名可以理解为图片的指纹).
当浏览器再次访问该图片时,去服务器校验指纹,如果图片没有变化,直接使用缓存中的图片,这样减轻了服务器的负担。
抓包观察:
第一次请求头:
响应头:
第二行的意思是:如果自“Tue,18 Jun 2013 14:04:32 GMT”这个时间点以后,图片修改过,则重新请求,如果该图片最新的签名Etag的值和If-None-Match的值不匹配,则重新请求
第二次的响应信息:
如果是304,就意味着浏览器从本地取缓存,节省了图片在网络上传输的时间。
如果网站比较大,有N台缓存服务器,那么这N台缓存服务器缓存主服务器上的文件缓存多久?
1.要不要缓存?
2.缓存多久?
思考------这说明,缓存服务器与主服务器之间,应该有一些协议来说明这些问题
追问------用什么协议来说明这2个问题?
答:还是http协议,用头信息cache-control来控制
具体用法:
在主服务器打开apache 的expire扩展,利用该扩展来控制图片,css,html等文件是否缓存的生存周期。
重启Apache
在.htaccess中,具体语法如下
ExpiresDefault是设置默认的缓存参数
ExpiresByType是按照文件类型来设计独特的缓存参数
我们用第二种来做测试,给jpg图片设置一个月的生存周期
后面4各参数怎么理解?
Base:基于那个时间点来计算缓存有效期
Access/now:基于请求响应的那一瞬间,比如从此瞬间到一个月之后。
Modification:基于被请求文件的最后修改日期来计算,比如被修改后的一周内仍然有效。
Num:是指缓存时间的大小
Type:缓存时间的单位(天)
放在:.htaccess
如果这是在集群环境中,缓存服务器得到此图片,将会认为一个月内有效。
减轻了主服务的负担。
我们能否设置服务器不让用缓存呢?
比如有些个人信息,不允许缓存服务器缓存,必须到服务器去请求
Control-cache:no-store.must-revalidate;//这个控制项不允许缓存,必须到主服务器验证。
可以利用apache的header模块
打开扩展,重启Apache
多次刷新页面发现:
上例可以看出,png格式的图片不允许缓存,因此每次都重新请求