ETag简介
实体标签(Entity Tag),是server和browser确认缓存组件的有效性的一种机制。 个人觉得,如果Expires是时间戳,ETag类似版本戳。 【见下图】:
ETag带来的问题
ETag的问题在于,通常用组件的某些属性(大小、时间、等)来构造它,这些属性对于特定的、寄宿了网站的服务器来说是唯一的。 当浏览器从一台服务器上获取了原始组件,之后,又向另外一台不同的服务器发起请求时,ETag是不会匹配的。 对于拥有多台服务器的网站,会大大降低有效性验证的成功率。 如果ETag不匹配,用户就不会按照ETag设计的那样收到更小更快的304响应; 相反,他们会收到普遍的200响应以及组件的所有数据。 如果你只用一台服务器上寄宿网站,这不是什么问题,但如果使用了服务器集群 组件下载的次数可能比必须下载的次数多得多,这将导致性能的下降。 如果有n台服务器,ETag匹配的概率只有 1/n。 【见下图】:
If-None-Match比If-Modified-Since具有更高的优先级。 实际上没有If-None-Match头反而会好一些。 你会说“我的组件添加了长久的Expires头”。 事实上,即使你的组件具有长久的Expires头,一旦用户单击Reload或者Refresh按钮,依然会产生get请求。 【If-None-Match和If-Modified-Sinc见下图】:
移除ETag
如何在Apache移除ETag: http://www.askapache.com/htaccess/apache-speed-etags.html 只需添加一行配置就能移除ETag: FileETag none 如何在IIS移除ETag: http://www.bytestopshere.com/post.cfm/disable-remove-etags-on-iis-6-to-improve-performance