规则13 配置ETag

1. ETag

  a. ETag(实体标签 Entity Tag)是web服务器和浏览器用于确认缓存组件的有效性的一种机制;

  b. 如果缓存过期了,则会发送一个条件GET请求进行有效性检查(和没设置Expires或max-age一样 Cache-Control:no-store才意味着不缓存);若用户明确加载(refresh or reload)则会发送一个max-age:0【刷新缓存有效期】的条件GET请求;组件仍有效服务器则返回340 Not Modified。

  c. 服务器检测缓存组件是否和服务器组件匹配有两种方式:比较最新修改时间 和 比较实体标签。

 

2. ETag存在的问题

  a. 服务器若发送了ETag,则浏览器在下次要发送条件GET请求时(Expires/max-age过期 或者没设置 或者  refresh or reload),会用If-None-Match头将ETag传回服务器,并且If-None-Match比If-Modified-Since优先级高;

  b. Apache 1.3 和 2.x 的ETag格式是:inode-size-timestamp,文件系统用inode来存储文件类型、所有者、组和访问模式等信息;(多台服务器的inode肯定不同)

    IIS 5.0 和 6.0 的ETag格式是:Filetimestamp:changeNumber,changeNumber适用于跟踪IIS配置变化的计数器;(一个网站的所有IIS服务器changeNumber不大可能相同)

    所以默认情况下,对于拥有多台服务器的网站,Apache和IIS想ETag中嵌入的数据都会大大地降低有效性验证的成功率;

    ETag还降低代理缓存的效率,浏览器和代理的缓存ETag经常不一样,这导致代理和浏览器之间不会出现304响应,而是两个200响应——一个是服务器到代理,一个是代理到用户;

 

3. 解决方法——配置或移除

  a. Apache 1.3.23版本之后支持FileETag指令,可以从ETag中移除inode值(只剩大小和时间戳);IIS中也可以为所有的服务器设置相同的changeNumber(只剩时间戳);

   这样存在重复信息,最好把ETag完全移除,Apache中:FileETag none;

  b. 对ETag进行配置,可以利用ETag灵活的验证能力,对最新修改日期之外的东西进行验证:

    <?php

      if(stropos($_SERVER["HTTP_USER_AGENT"], "MSIE")){

        header("ETag: MSIE") ;

      }

      else{

        header("ETag: notMSIE") ;
      }

    ?>

    ——利用ETag来反映浏览器状态

  

posted on 2013-04-13 21:59  BigPalm  阅读(515)  评论(0编辑  收藏  举报

导航