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