?
This document uses PHP Chinese website manual Release
所述ETag
HTTP 響應(yīng)報(bào)頭為資源的特定版本的標(biāo)識符。它允許緩存更高效,并節(jié)省帶寬,因?yàn)槿绻麅?nèi)容沒有改變,Web 服務(wù)器不需要發(fā)送完整的響應(yīng)。另一方面,如果內(nèi)容發(fā)生了變化,etags 有助于防止資源的同時(shí)更新互相覆蓋(“空中沖突”)。
如果給定 URL 處的資源發(fā)生更改,則Etag
必須生成新值。因此,Etags 與指紋相似,也可能用于某些服務(wù)器的跟蹤目的。它們的比較可以快速確定資源的兩個(gè)表示是否相同,但它們也可能被設(shè)置為無限期地由跟蹤服務(wù)器持續(xù)存在。
Header type | Response header |
---|---|
Forbidden header name | no |
ETag: W/"<etag_value>"ETag: "<etag_value>"
W/
可選'W/'
(區(qū)分大小寫)表示使用弱驗(yàn)證程序。弱驗(yàn)證器很容易生成,但對于比較來說卻不太有用。強(qiáng)大的驗(yàn)證器是進(jìn)行比較的理想選擇,但可能非常難以高效生成。
Etag
相同資源的兩個(gè)表示的弱值可能在語義上是等價(jià)的,但不是字節(jié)一致的?!?lt;etag_value>”實(shí)體標(biāo)記唯一地表示請求的資源。它們是放在雙引號(像是"675af34563dc-tr34"
)之間的 ASCII 字符串。
ETag
沒有指定生成值的方法。通常,使用內(nèi)容的散列,最后修改時(shí)間戳的散列或僅修訂版本號。例如,MDN 使用 wiki 內(nèi)容的十六進(jìn)制數(shù)字的散列。
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"ETag: W/"0815"
借助標(biāo)題ETag
和If-Match
頭文件,您可以檢測到空中編輯沖突。
例如,在編輯 MDN 時(shí),當(dāng)前的 wiki 內(nèi)容被散列并放入Etag
響應(yīng)中:
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
當(dāng)保存對 wiki 頁面的更改(發(fā)布數(shù)據(jù))時(shí),POST
請求將包含包含要檢查新鮮度If-Match
的ETag
值的標(biāo)題。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
如果散列不匹配,則意味著文檔已被編輯,并且412
Precondition Failed
引發(fā)錯(cuò)誤。
ETag
標(biāo)題的另一個(gè)典型用例是緩存未更改的資源。如果用戶再次訪問一個(gè)給定的 URL(它有一個(gè)ETag
集合),并且它已經(jīng)過時(shí)了,那么這個(gè) URL 太舊而不能被視為可用,客戶端會將它的值發(fā)送到ETag
一個(gè)If-None-Match
標(biāo)題字段中:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
服務(wù)器比較客戶端ETag
(與其If-None-Match
一起發(fā)送)ETag
與其當(dāng)前版本的資源,并且如果兩個(gè)值匹配(即資源沒有改變),則服務(wù)器發(fā)回304
Not Modified
狀態(tài),沒有任何正文,告訴客戶端緩存版本的響應(yīng)仍然很好用(新鮮)。
Specification | Title |
---|---|
RFC 7232, section 2.3: ETag | Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests |
Feature | Chrome | Firefox | Edge | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |