前言
在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的屬性。現在,我請求七牛雲上的一個資源:

可以通過它的響應頭看到,返回了Etag字段給我們。Etag的值為Fpl1rXE-K20cYsLu89YTzUQ3ydDk。
再次刷新資源:

此時,HTTP的狀態碼變成了304,304狀態碼表示資源未改變。查看此次的HTTP請求頭,如下:

可以看到,客戶端在向服務端請求資源的時候,通過If-None-Match請求頭帶上了之前服務端返回的Etag的值。服務端收到第二次請求的時候,發現攜帶了If-None-Match字段,就重新計算服務器對應資源的Etag,如果二者匹配了,就認為資源沒有發生變化,直接給客戶端相應304,讓客戶端讀取緩存中的數據。
總結
本文只是對Etag做一個概念性的講解,並且結合了七牛雲的對象存儲的例子,分析了Etag緩存的流程。關於Etag,還有很多東西沒有深入講解,比如Etag是怎么計算的,Last-Modified/If-Modified-Since是什么,以及Etag實戰等,這些在后續再做深入的講解吧!
