HTTP協議緩存策略深入詳解之ETAG妙用


Etag是什么:

 

Etag 是URL的Entity Tag,用於標示URL對象是否改變,區分不同語言和Session等等。具體內部含義是使服務器控制的,就像Cookie那樣。

  HTTP協議規格說明定義ETag為“被請求變量的實體值” 。另一種說法是,ETag是一個可以與Web資源關聯的記號(token)。典型的Web資源可以一個Web頁,但也可能是JSON或XML文檔。服務器單獨負責判斷記號是什么及其含義,並在HTTP響應頭中將其傳送到客戶端。

 

實例詳解:

 

也許讀者們看完這個概念,還是搞不清楚這個etag響應頭消息到底是干什么的,具體如何使用,所以接下來的篇幅我會用一個實際的例子來詳細闡述etag的妙用。

 

 

想必許多網友都有訂閱某些大蝦的RSS的習慣吧,但是大蝦也是人,也要吃飯睡覺打豆豆,所以不可能無時無刻的在從事文學創作,因此一般產量較高的大蝦也許平均每天能更新兩篇已經是不錯了,但是網友們卻總是不斷的去刷新RSS訂閱的內容,期望在下次刷新中又有新的勁爆文章出現,如果我們每次刷新,都要從服務器端重新獲取內容(事實上,幾乎一天內95%以上的刷新返回的都是相同內容,因為剛才也說了,大蝦一般一天也就出一兩篇新文章而已,所以大部分時間內,內容都是相同的),如果訂閱量相當巨大,這對於服務器的壓力還是帶寬都是一個嚴重的挑戰。其實真正需要服務器重新返回內容是大蝦們更新了新的文章后,而其他時間我們無論怎么刷新服務器最好能做到不需返回任何數據,這才是一個比較好的方案,而我們的主角etag響應頭的出現正是為了解決這個問題。

 

 

瀏覽器端實現

 

當我們訂閱了某大蝦的RSS,如圖,我們點擊左下角“RSS”按鈕:


然后我們進入了rss訂閱的相關頁面,此時我們打開tamper data查看下http請求和響應的一些內容(這里我們截獲http請求和響應信息的工具是基於FF瀏覽器的tamper data插件,如果您對這個插件不熟悉,請參考我的另外一篇介紹該工具的文章--  Tamper Data安裝與使用簡介 )。如下圖:

 


從上圖我們可以看到,服務器端返回響應值為200,並發送回了相應的網頁內容,在http響應頭中有etag消息頭,值為

Etag="fca75d26f6dc8111a7d1b24e9debd652",我們不需要去關心這個響應頭的內容是什么,我們只需要將這這個

頭信息的值記錄下來,隨便創建一個notepad之類的東西保存好,以備接下來的實驗使用。

 

然后我們刷新,希望能從webserver端獲取該大蝦新的文章,這時候我們用tamper data查看下http頭中有哪些內容,如下圖:

 

 

從此圖中我們可以看到If-None-Match="fca75d26f6dc8111a7d1b24e9debd652",而該值的內容和我們先前第一次

刷新返回的http響應中的etag響應頭的值完全一樣。

 

如果某大蝦並沒在這段時間內發表任何文章,於是webserver端的rss文件沒有任何變化,於是If-None-Match值和server端

的etag值相比較完全相等,這時候服務器就會認為客戶端已經有最新的rss文件內容的緩存了,於是服務器就會發送一個 響應碼

為“304”的http響應,304響應想必大家都知道是什么意思了,沒錯,他不包含任何響應的內容,只是提示客戶端緩存的內容是最新的,

如下圖


 

 

如果某大蝦剛發表了一篇新的文章,因此在webserver中的rss的內容發生了改變,因此他的etag值就會發生改變,於是服務器會拿http請求中的If-None-Match的

值和改變和的etag值做對比,顯然不正確的,於是webserver就會發送一個新的rss內容給客戶端,這里我不能強制要求某大蝦來配合我們的實驗去立馬發表新文章,

所以我們就變相做,也就是我們故意修改http請求頭中的If-None-Match的值,這樣就和服務器端的etag就不會匹配了,顯然這時候服務器就會受騙發送一份“新”的

rss內容回來,如下圖:

 

 

 

 

 

這里我們將http請求中的If-None-Match的值改為了"modifiedForOurTest", 顯然與響應中的Etag="fca75d26f6dc8111a7d1b24e9debd652"不同,因此服務器就被受騙認為瀏覽器沒有最新的文件內容,於是就返回了全新的響應內容(狀態碼200),而事實上瀏覽器端是有最新的內容的緩存的。

 

 

結束語:

 

 好了,到這里,對這個etag響應頭的講解就結束了,如果反應不錯,下一篇我們將介紹並實例詳解cache-control的用法,敬請期待:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM