整理者:華科小濤:http://www.cnblogs.com/hust-ghtao/面試
前段時間參加某公司的面試,問我ETag字段,當時說的不是很清楚,找了些資料,整理爲此篇。緩存
簡單的說ETag即相似於資源實體的指紋,而且他們可以被快速地被比較,以肯定兩個版本的資源是否相同。ETag的比較只對同一個URL有意義,不一樣 URL上的資源的ETag值可能相同也可能不一樣,從他們的ETag的比較中無從推斷。服務器
首部字段ETag能告知客戶端實體標識。它是一種可將資源以字符串作惟一性標識的方式。服務器會爲每份資源分配對應的ETag值,當資源更新時, ETag值也須要更新。生成ETag經常使用的方法包括對資源內容使用抗碰撞散列函數,使用最近修改的時間戳的哈希值,甚至只是一個版本號。app
在典型用法中,當一個URL被請求,Web服務器會返回資源和其相應的ETag值,它會被放置在HTTP的「ETag」字段中:函數
1: ETag: "686897696a7c876b7e"
而後,客戶端能夠決定是否緩存這個資源和其ETag。之後,若是客戶端想再次請求相同的URL,將會發送一個包含已保存的ETag和「If-None-Match」字段的請求。spa
1: If-None-Match: "686897696a7c876b7e"
客戶端請求以後,服務器可能會比較客戶端的ETag和當前版本資源的ETag。若是ETag值匹配,這就意味着資源沒有改變,服務器便會發送回一個極短的響應,包含HTTP 「304 未修改」的狀態。304狀態告訴客戶端,它的緩存版本是最新的,並應該使用它。code
然而,若是ETag的值不匹配,這就意味着資源極可能發生了變化,那麼,一個完整的響應就會被返回,包括資源的內容,就好像ETag沒有被使用。這種狀況下,客戶端能夠用新返回的資源和新的ETag替代先前的緩存版本。blog