ETag
ETag(或實體標籤)HTTP 響應頭是資源特定版本的識別符號。它使快取更有效率並節省頻寬,因為如果內容沒有更改,Web 伺服器不需要重新發送完整的響應。此外,ETag 有助於防止對資源的同步更新相互覆蓋("空中碰撞")。
如果給定 URL 上的資源發生更改,則必須生成新的 Etag 值。對它們的比較可以確定資源的兩個表示是否相同。
語法
ETag: W/"<etag_value>"
ETag: "<etag_value>"
指令
W/可選-
'W/'(區分大小寫)表示使用了弱驗證器。弱 ETag 很容易生成,但對比較而言用處不大。強驗證器非常適合比較,但高效生成可能非常困難。相同資源的兩個表示的弱ETag值在語義上可能是等效的,但位元組對位元組並不完全相同。這意味著當使用位元組範圍請求時,弱 ETag 會阻止快取,而強 ETag 意味著範圍請求仍然可以被快取。 - "<etag_value>"
-
唯一代表所請求資源的實體標籤。它是一個在雙引號之間放置的ASCII 字串,例如
"675af34563dc-tr34"。ETag值的生成方法沒有指定。通常,ETag 值是內容的雜湊值、最後修改時間戳的雜湊值,或者只是一個修訂號。例如,維基引擎可以使用文件文章內容的十六進位制雜湊值。
示例
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
避免空中碰撞
藉助 ETag 和If-Match 頭,您可以檢測空中編輯衝突。
例如,在編輯維基時,當前維基內容可能會被雜湊並放入響應中的 Etag 頭中
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
儲存對維基頁面的更改(釋出資料)時,POST 請求將包含包含要檢查新鮮度的 ETag 值的If-Match 頭。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
如果雜湊值不匹配,則表示文件已在中間進行了編輯,並將丟擲412 前提條件失敗 錯誤。
未更改資源的快取
ETag 頭的另一個典型用途是快取未更改的資源。如果使用者再次訪問給定 URL(設定了 ETag),並且它陳舊(太舊而無法被認為可用),則客戶端將在If-None-Match 頭欄位中傳送其 ETag 的值
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
伺服器將客戶端的 ETag(使用 If-None-Match 傳送)與其當前版本資源的 ETag 進行比較,如果這兩個值匹配(即資源沒有更改),則伺服器將傳送回304 未修改 狀態,沒有正文,這告訴客戶端快取的響應版本仍然可以使用(新鮮)。
規範
| 規範 |
|---|
| HTTP 語義 # field.etag |
瀏覽器相容性
BCD 表格僅在瀏覽器中載入