ETag 頭部

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

HTTP ETag(實體標籤)響應頭是資源特定版本的一個識別符號。它讓快取更高效,並節省頻寬,因為如果內容沒有改變,Web 伺服器就不需要重新發送完整的響應。此外,ETag 有助於防止對資源的併發更新相互覆蓋(“空中碰撞”)。

如果給定 URL 的資源發生變化,則必須生成新的ETag值。透過比較它們可以確定資源的兩個表示形式是否相同。

頭型別 響應頭表示頭
禁止請求頭

語法

http
ETag: W/"<etag_value>"
ETag: "<etag_value>"

指令

W/ 可選

W/(區分大小寫)表示使用了弱驗證器。弱 ETag 易於生成,但對比較而言用處較小。強驗證器非常適合比較,但很難高效生成。同一資源的兩個表示形式的弱ETag值可能在語義上等效,但不是逐位元組相同。這意味著弱 ETag 在使用位元組範圍請求時會阻止快取,但強 ETag 意味著範圍請求仍可以被快取。

<etag_value>

唯一表示所請求資源的實體標籤。它是一個由雙引號括起來的ASCII字串,例如"675af34563dc-tr34"ETag值的生成方法未指定。通常,ETag 值是內容的雜湊值、最後修改時間戳的雜湊值或僅僅是一個修訂號。例如,一個 Wiki 引擎可以使用文件文章內容的十六進位制雜湊值。

示例

http
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"

避免空中碰撞

藉助ETagIf-Match頭,您可以檢測空中編輯衝突。

例如,在編輯 Wiki 時,當前的 Wiki 內容可能會被雜湊並放入響應的ETag頭中

http
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

儲存對 Wiki 頁面的更改(提交資料)時,POST請求將包含If-Match頭,其中包含用於檢查新鮮度的ETag值。

http
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

如果雜湊值不匹配,則表示文件在此期間已被編輯,並會丟擲412 Precondition Failed錯誤。

未更改資源的快取

ETag頭的另一個典型用途是快取未更改的資源。如果使用者再次訪問給定 URL(已設定ETag),並且該 URL 是過期的(太舊而不能被視為可用),客戶端將透過If-None-Match頭欄位傳送其ETag

http
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

伺服器會將客戶端的ETag(隨If-None-Match傳送)與其當前版本資源的ETag進行比較,如果兩個值匹配(即資源未更改),伺服器會返回一個不帶主體的304 Not Modified狀態,這會告知客戶端響應的快取版本仍然可以使用(新鮮的)。

規範

規範
HTTP 語義
# field.etag

瀏覽器相容性

另見