你知道HTTP協議的ETag是幹什麼的嗎?

前言

在HTTP1.1規範中,新增了一個HTTP頭信息:ETag。對於普通開發者來講,可能平時真的不會接觸到該HTTP頭。平時接觸不到或者說用得少,不表明這個請求頭不重要。ETag使用得當,是能夠減小服務器帶寬壓力的。瀏覽器

什麼是ETag?

Etag是 Entity tag的縮寫,能夠理解爲「被請求變量的實體值」,Etag是服務端的一個資源的標識,在 HTTP 響應頭中將其傳送到客戶端。所謂的服務端資源能夠是一個Web頁面,也能夠是JSON或XML等。服務器單獨負責判斷記號是什麼及其含義,並在HTTP響應頭中將其傳送到客戶端。好比,瀏覽器第一次請求一個資源的時候,服務端給予返回,而且返回了ETag: "50b1c1d4f775c61:df3" 這樣的字樣給瀏覽器,當瀏覽器再次請求這個資源的時候,瀏覽器會將If-None-Match: W/"50b1c1d4f775c61:df3" 傳輸給服務端,服務端拿到該ETAG,對比資源是否發生變化,若是資源未發生改變,則返回304HTTP狀態碼,不返回具體的資源。緩存

Etag實際例子講解

咱們能夠經過Etag來利用瀏覽器的緩存,下降咱們服務器的帶寬壓力。這是能夠提高服務端的性能的(數據傳輸上)。七牛雲的文件存儲,就用到了Etag的屬性。如今,我請求七牛雲上的一個資源: 服務器

image.png

能夠經過它的響應頭看到,返回了Etag字段給咱們。Etag的值爲Fpl1rXE-K20cYsLu89YTzUQ3ydDk。性能

再次刷新資源: cdn

image.png
此時,HTTP的狀態碼變成了304,304狀態碼錶示資源未改變。查看這次的HTTP請求頭,以下:
image.png
能夠看到,客戶端在向服務端請求資源的時候,經過If-None-Match請求頭帶上了以前服務端返回的Etag的值。服務端收到第二次請求的時候,發現攜帶了If-None-Match字段,就從新計算服務器對應資源的Etag,若是兩者匹配了,就認爲資源沒有發生變化,直接給客戶端相應304,讓客戶端讀取緩存中的數據。

總結

本文只是對Etag作一個概念性的講解,而且結合了七牛雲的對象存儲的例子,分析了Etag緩存的流程。關於Etag,還有不少東西沒有深刻講解,好比Etag是怎麼計算的,Last-Modified/If-Modified-Since是什麼,以及Etag實戰等,這些在後續再作深刻的講解吧!對象

相關文章
相關標籤/搜索