網頁效能、快取與 CDN

實體標籤(ETag)

/ EE-tag /

假設你影印了一份文件,想在日後得知原件是否變過——卻又不想整份重讀。最簡單的訣竅是一個短指紋:辦公室在每個版本上寫一個代碼,你只要比對代碼即可。若原件上的代碼仍與你副本上的代碼相符,就表示沒變。ETag(entity tag,實體標籤)正是網路資源的那個指紋。伺服器把它當作回應標頭附上——例如 ETag: "a17f9"——用來辨識這份內容的這個特定版本。

快取用它做便宜的重新驗證。當一份快取副本過時,快取不會重新下載整個資源;它送出一個條件式請求,帶著標頭 If-None-Match: "a17f9",等於在問「你還是版本 a17f9 嗎?」。伺服器把這個標籤與目前內容比對。若相符,它回覆 304 Not Modified,內文是空的——確認所存副本仍可用——只有那一小段標頭在傳輸。若內容變了,伺服器送回完整的新內文連同一個新的 ETag。標籤本身可以是內容的雜湊值或版本計數器;唯一的要求是:內容一變,它也要變。

為什麼重要:ETag 讓「過時」變得便宜可解。快取不必在「總是重新取得(浪費)」與「冒險使用過時資料(不正確)」之間二選一,而能把副本留久一點,再用一次往返確認,且這次往返通常只回來一個近乎空的 304。ETag 與 Last-Modified 日期(以時間戳為基礎的驗證子)互補,且往往更精確,因為同一秒內的兩次編輯仍會產生不同的標籤。一個細節:弱 ETag(寫成 W/"...")表示「語意上等價」而非「逐位元組完全相同」,適合那些只在壓縮或無關緊要空白上有差異的回應。

你的瀏覽器持有一份快取的 profile.json,標籤是 "v12"。下次造訪時它送出 If-None-Match: "v12"。資料未變,所以伺服器回 304 Not Modified、無內文——省下整個下載,卻確認了副本是最新的。

比對指紋而非重新下載:一個 304 就確認了副本。

ETag 辨識的是版本;它不是用於完整性的檢查碼,也不是安全權杖。它只告訴快取「自己的副本是否與目前的相符」——並不證明內容真實或未遭竄改(那是 TLS 的工作)。

又称
entity tag實體標籤ETag 標頭