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