全稱爲: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瀏覽器