web缓存相关概念及测试

本打算在上一篇文章中将自己关于PHP图片缓存的理解写出来的,写了一半感觉似是而非,不得不停下来继续学习。

找到下面这两篇篇文章,做个收藏,回头再整理,先工作。。

http://www.cnblogs.com/_franky/archive/2011/11/23/2260109.html

http://www.cnblogs.com/_franky/archive/2012/07/05/2577141.html


Etag在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件后面添加一个唯一的参数(相当于查询参数字符串),Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取 Etag发生变化的文件,减少浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了。


现在我们有个问题为什么要使用Etag呢?


Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个 文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法 判断.原因是UNIX记录MTIME只能精确到秒.所以我们选择生成Etag,因为Etag可以综合Inode,MTime和Size,可以避免这个问 题.


Etag的工作原理
Etag在服务器上生成后,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。我们常见的是使用If- None-Match.请求一个文件的流程可能如下:
新的请求
客户端发起HTTP GET请求一个文件(css ,image,js);服务器处理请求,返回文件内容和一堆Header(包括Etag,例如”2e681a-6-5d044840″),http头状态 码为为200.


同一个用户第二次这个文件的请求
客户端在一次发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头中会包括上次这个文件的Etag(例如”2e681a- 6-5d044840″),这时服务器判断发送过来的Etag和自己计算出来的Etag,因此If-None-Match为False,不返回200,返 回304,客户端继续使用本地缓存;


注意.服务器又设置了Cache-Control:max-age和Expires时,会同时使用,也就是说在完全匹配If-Modified- Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.

在Apache中设置Etag的支持比较简单,只需要在apache的配置中加入下面的内容就可以了:
比如我现在在.htaccess文件里面写

<IfModule mod_headers.c>
<FilesMatch ".(gif|jpg|jpeg|png|ico)$"> 
#Header set Expires "Thu, 01 Dec 2003 16:00:00 GMT"
#Header set Cache-Control "no-store"
ExpiresDefault A6048
ExpiresByType image/png A30
FileETag MTime Size
</FilesMatch>


opera不知道为什么每次都会去服务器请求一次,即使没过期也不会使用本地缓存,这个之后再研究

opera的http头如图:


今天我又测试了一遍,代码都没有变化,但是opera的表现变的很乖巧了,下面是测试结果,以下所有的游览器(都是最新版本的测试结果)都使用了本地缓存:

Opera:


Chrome:


ps:之前犯糊涂,chrome 设置了disable cache....测试结果纠结死我了

firfox:

刷新结果:

再次请求(非刷新),从firebug直接看不到请求信息,使用了本地缓存

IE:

跟firefox表现一致,使用本地缓存时在自带的开发者 工具中直接看不到请求


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值