ETag


    全称为:Entity Tag,意思是实体标签,从名字上看,是对于某种实体的一个标识。它的做用是用一个特殊的字符串来标识某个资源的“版本”,客户端(浏览器)来请求的时候,能够比较,若是ETag一致,则表示该资源并无修改过,客户端(浏览器)可使用本身缓存的版本。

## ETag工做原理 ##

    当用户第一次请求某个资源(一般为静态资源)的时候,正常状况下,他将获得一个状态码为200的响应,而且在响应头部中会包含一个ETag的信息(ETag    "6ab823201a4ece1:0"(不一样的服务器可能会有所不一样)),若是用户再次请求这个资源的话,浏览器会尝试在请求头部中包含这个信息,以便服务器能够比较,肯定是要再次发送资源的内容。若是发现浏览器提供的值与该资源实际的值是同样的,它就会返回了304的状态码,并且不须要在响应的正文里面包含任何实际内容。浏览器获得304这个状态码以后,就知道该资源并无被修改,因此直接使用本地缓存的版本。

## ETag功能 ##

    主要能提供对资源的版本标识,以免无谓的重复下载。提升了性能。


## Expires 、 Cache-Control 、 ETag 区别 ##

**Expires:**

    服务器经过这个Header告诉浏览器,某资源直到某个时间才会过时,因此在没有过时以前,浏览器就直接使用本地的缓存了。

**问题:**

    由于这是时间是由服务器发送的(UTC),但若是服务器时间和客户端事件存在不一致,可能会有些问题。可能存在版本的问题,由于若是在到期以前修改过了,客户端是不会知道的。
    
**Cache-Control **

    服务器经过一个Header(Last-Modified)告诉浏览器,某资源最后修改的时间,浏览器在请求的时候,包含一个Header(If-Modified-Since),而后服务器能够进行比较,若是在该时间后没有修改过,则返回304。它比Expires多不少选项设置。
    
**问题:**

    Last-Modified 也是一个时间,但该时间只能精确到秒,若是在同一个秒中有屡次修改(这个在如今的环境下应该确实是可能的),则可能会发生问题。
    
    
**ETag **  

    能够更加精确地判断资源是否被修改,由于它不是一个时间值,而是对时间通过处理的一个长整型数值,浏览器发起新请求时须要包含 If-None-Match
    
**问题:**
    
    若是部署在服务器场环境中,配置不当的话,可能每一个服务器会对相同的资源生成不同的ETag,这样就增长了重复下载的可能性。
    
    
**优先级从大到小:**
    
    ETag、Cache-Control、Expires浏览器

相关文章
相关标签/搜索