HTTP缓存详解之etag

-----------------

Apache 1.3和2.x中的ETag格式为inode-size-timestamp。即使某个文件在不同的服务器上都处于相同的目录下,文件大小、权限、时间戳等都完全相同,但是在不同服务器上他们的内码也是不同的。
IIS 5.0和IIS 6.0处理ETag的机制相似。IIS中的ETag格式为Filetimestamp:ChangeNumber。用ChangeNumber来跟踪 IIS配置的改变。网站所用的不同IIS服务器间ChangeNumber也不相同。不同的服务器上的Apache和IIS即使对于完全相同的内容产生的ETag在也不相同,用户并不会接收到一个小而快的304响应;相反他们会接收一个正常的200响应并下载全部内容。如果你的网站只放在一台服务器上,就不会存在这个问题。但是如果你的网站是架设在多个服务器上,并且使用Apache和 IIS产生默认的ETag配置,你的用户获得页面就会相对慢一点,服务器会传输更多的内容,占用更多的带宽,代理也不会有效地缓存你的网站内容。即使你的 内容拥有Expires文件头,无论用户什么时候点击“刷新”或者“重载”按钮都会发送相应的GET请求。如果你没有使用ETag提供的灵活的验证模式,那么干脆把所有的ETag都去掉会更好

----------------

Etag是什么: http://www.javaeye.com/topic/656658 

Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。

HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

实例详解:

也许读者们看完这个概念,还是搞不清楚这个etag响应头消息到底是干什么的,具体如何使用,所以接下来的篇幅我会用一个实际的例子来详细阐述etag的妙用。

想必许多网友都有订阅某些大虾的RSS的习惯吧,但是大虾们不可能无时无刻的从事文学创作,因此一般产量较高的大虾也许 平均每天能更新两篇已经是不错了,但是网友们却总是不断的去刷新RSS订阅的内容,期望在下次刷新中又有新的劲爆文章出现,如果我们每次刷新,都要从服务器端重新获取内容(事实上,几乎一天内95%以上的刷新返回的都是相同内容,因为刚才也说了,大虾一般一天也就出一两篇新文章而已,所以大部分时间内,内 容都是相同的),如果订阅量相当巨大,这对于服务器的压力还是带宽都是一个严重的挑战。

其实真正需要服务器重新返回内容是大虾们更新了新的文章后,而其他时间我们无论怎么刷新服务器最好能做到不需返回任何数据,这才是一个比较好的方案,而我们的主角etag响应头的出现正是为了解决这个问题。

浏览器端实现

当我们订阅了某大虾的RSS,如图,我们点击左下角“RSS”按钮:

HTTP缓存详解之etag

你可能感兴趣的:(HTTP缓存详解之etag)