《高性能网站建设指南》阅读笔记_规则13- 配置ETag
ETag:实体标签,是web服务器和浏览器用于确认缓存组件的有效性的一种机制。是唯一标识了一个组件的一个特定版本的字符串.IIS上的ETag格式是Filetimestamp:ChangeNumber即;时间戳和跟踪IIS配置变化的计数器组成的字符串。
工作机制:
前面提到过,检测组件是否有效时,是通过Web服务器与客户端缓存的组件进行匹配的。有两种方式:
--比较最新修改日期
原始服务器通过的Last-Modified响应头来返回组建的最新修改日期,浏览器通过If-Modefied-since进行比较判断,如果匹配则返回304(not Modefied),避免了200请求
-- 比较ETag实体标签
服务器传递客户端组件一个ETag,如:
服务器发送ETag:"10c24bc-4ab-457e1c1f"
此后,如果浏览器验证该组件,则会使用If-None-Match头将ETag传回原始服务器,如:
浏览器发送If-None-Match:"10c24bc-4ab-457e1c1f"
如果相同,则服务器返回304 Not Modified
如果不相同,则服务器重新向浏览器发送该组件。
如果一个网站有多台服务器,那么,对于完全相同的组件,从一台服务器到另一台服务器,IIS产生的ETag是不会匹配的。就是说如果有10台服务器,用户得到正确304响应的几率只有10%,其余的90%都会得到200响应并下载所有的数据,
需要注意的是:ETag的服务器返回(If-None-Match)比最新修改日期的返回(If-Modified-Since)具有更高的优先级。如果同时存在,则会禁止返回304 Not Modified。
建议:
ETag只用在单个服务器的网站上,在多服务器的网站上,可以修改ETag格式(如:IIS中实现从ETag中移除ChangeNumber,只留时间戳),但这样和Last-Modified头是等效的。所以最好将ETag完全移除,已避免组件的重复下载。
如何在IIS中移除ETag,参考:
http://support.microsoft.com/?id=922733
http://support.microsoft.com/?id=922703