精品主題,實(shí)戰(zhàn)科普,最新行業(yè)熱點(diǎn)話題,隨時(shí)掌握云上咨訊。
什么是ETag?
實(shí)體標(biāo)簽(EntityTag)是唯一標(biāo)識(shí)了一個(gè)組件的一個(gè)特定版本的字符串,是web服務(wù)器用于確認(rèn)緩存組件的有效性的一種機(jī)制,通??梢允褂媒M件的某些屬性來構(gòu)造它。
條件GET請(qǐng)求
瀏覽器下載組件的時(shí)候,會(huì)將它們存儲(chǔ)到瀏覽器緩存中。如果需要再次獲取相同的組件,瀏覽器將檢查組件的緩存時(shí)間,假如已經(jīng)過期,那么瀏覽器將發(fā)送一個(gè)條件GET請(qǐng)求到服務(wù)器,服務(wù)器判斷緩存還有效,則發(fā)送一個(gè)304響應(yīng),告訴瀏覽器可以重用緩存組件。
那么服務(wù)器是根據(jù)什么判斷緩存是否還有效呢?答案有兩種方式,一種是前面提到的ETag,另一種是根據(jù)最新修改時(shí)間。先來看看最新修改時(shí)間。
最新修改時(shí)間
原始服務(wù)器通過Last-Modified響應(yīng)頭來返回組件的最新修改時(shí)間。
以一個(gè)實(shí)際例子來說明,當(dāng)我們不帶緩存訪問www.google.com.hk的時(shí)候,我們需要下載google的logo,這時(shí)會(huì)發(fā)送這樣一個(gè)HTTP請(qǐng)求:
Request:
GET /logo.png HTTP 1.1
Host: www.google.com.hk
Response:
HTTP 1.1 200 OK
Last-Modified:Wed, 09 Oct 2013 01:35:39 GMT
當(dāng)需要再次訪問相同組件的時(shí)候,同時(shí)緩存已經(jīng)過期,瀏覽器會(huì)發(fā)送如下條件GET請(qǐng)求:
Request:
GET /logo.png HTTP 1.1
If-Modified-Since:Wed, 09 Oct 2013 01:35:39 GMT
Host: www.google.com.hk
Response:
HTTP 1.1 304 Not Modified
實(shí)體標(biāo)簽
ETag提供了另外一種方式,用于檢測(cè)瀏覽器緩存中的組件與原始服務(wù)器上的組件是否匹配。摘抄自書上的例子:
不帶緩存的請(qǐng)求:
Request:
GET /i/yahoo/gif HTTP 1.1
Host: us.yimg.com
Response:
HTTP 1.1 200 OK
Last-Modified:Tue,12 Dec 200603:03:59 GMT
ETag:”10c24bc-4ab-457elc1f“
再次請(qǐng)求相同組件:
Request:
GET /i/yahoo/gif HTTP 1.1
Host: us.yimg.com
If-Modified-Since:Tue,12 Dec 200603:03:59 GMT
If-None-Match:”10c24bc-4ab-457elc1f“
Response:
HTTP 1.1 304 Not Midified
當(dāng)ETag和Modified-Time都出現(xiàn)了,則原始服務(wù)器禁止返回304除非請(qǐng)求中的條件頭字段全部一致。
為什么要引入ETag?
ETag主要是為了解決Last-Modified無法解決的一些問題:
1. 一些文件也許會(huì)周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了,而重新GET;
2. 某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改,(比方說1s內(nèi)修改了N次),If-Modified-Since能檢查到的粒度是s級(jí)的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒);
3. 某些服務(wù)器不能精確的得到文件的最后修改時(shí)間。
ETag帶來的問題
ETag的問題在于通常使用某些屬性來構(gòu)造它,有些屬性對(duì)于特定的部署了網(wǎng)站的服務(wù)器來說是唯一的。當(dāng)使用集群服務(wù)器的時(shí)候,瀏覽器從一臺(tái)服務(wù)器上獲取了原始組件,之后又向另外一臺(tái)不同的服務(wù)器發(fā)起條件GET請(qǐng)求,ETag就會(huì)出現(xiàn)不匹配的狀況。
最佳實(shí)踐
1. 如果使用Last-Modified不會(huì)出現(xiàn)任何問題,可以直接移除ETag,google的搜索首頁(yè)則沒有使用ETag。
2. 確定要使用ETag,在配置ETag的值的時(shí)候,移除可能影響到組件集群服務(wù)器驗(yàn)證的屬性,例如只包含組件大小和時(shí)間戳。