使用 ETag 以利用瀏覽器緩存,節省帶寬

ETag 可以理解爲服務端的一個資源標識,當兩次請求相同的 URL,且 URL 對應的資源沒有變化時 ETag 的值應該相同。合理使用 ETag 可以有效利用瀏覽器緩存,降低服務器的帶寬壓力。

原理分析

用戶第一次通過 URL 請求資源時,服務器將爲該資源生成 ETag(其值一般爲MD5摘要),並通過響應頭返回給瀏覽器,瀏覽器會將資源進行緩存。下次相同 URL 被請求時,瀏覽器將在請求中附加 If-None-Match 請求頭,其值爲上次請求返回的 ETag 的值,服務端收到該請求後仍需要對當前版本的資源取 MD5 摘要,然後與 If-None-Match 頭的值進行比較,相同就表示資源未更改,瀏覽器可以使用緩存,無需再次下載該資源(服務器將返回不帶任何內容的 304未修改狀態)。

ETag 頭往往需要與 Cache-Control 緩存指令配合使用,從上面的描述我們可以知道即使瀏覽器拿到了 ETag 且已經緩存了資源,再次請求資源時也需要由原始服務器進行檢查,以驗證資源是否被修改,因此 Cache-Control 響應頭的值應包含 no-cache 以使瀏覽器採用協商緩存驗證。另外爲了避免任何中間人(代理,CDN 等)的干擾,Cache-Control 響應頭的值應包含 private 私有緩存,即 “private, no-cache”。

參考:

  1. Cache-Control
  2. ETag

注意事項

ETag 可視爲對資源是否改動進行驗證的驗證器,ETag 分爲強驗證器和弱驗證器,一些 HTTP 中間代理服務(如 nginx)可能會對資源進行壓縮或處理,致使強驗證器被修改爲若驗證器,甚至驗證器被移除,解決辦法是一開始就讓原服務器生成弱驗證器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章