特性
- ETag和If-None-Match是一對怯邪;Last-Modified和If-Modified-Since是一對
- 它們都屬于協(xié)商緩存,對內(nèi)容的有效性進行驗證花墩,具體看這里
- 驗證的過程是類似(以Etag為例):首次請求悬秉,如果response header含有Etag值,則下一次請求冰蘑,request header 就會帶上If-None-Match和泌,它的值為上次接收到服務(wù)器發(fā)來的Etag的值。服務(wù)器接收到這個值和自身現(xiàn)在的Etag比較祠肥,來判斷內(nèi)容是否有變化武氓。如果沒變化則返回請求頭304,有變化則重新從服務(wù)器獲取內(nèi)容仇箱,成功的話返回200和內(nèi)容县恕。這個過程是瀏覽器自動完成的。
- 生成值的方法不同: Etag的值通常為文件內(nèi)容的哈希值剂桥;而Last-Modified為最后修改的時間忠烛。
ETag特點
- Last-Modified只能精確到秒,秒之內(nèi)的內(nèi)容更新Etag才能檢測
- 文件有時會定時重新生成相同內(nèi)容权逗,Last-Modified不能很好辨別
- etag每次服務(wù)端生成都需要進行讀寫操作美尸,而last-modified只需要讀取操作冤议,etag的消耗是更大的
Etag/If-None-Match例子
- 第一次請求
2.第二次請求
通過實驗可以清晰看到這個請求頭是怎么起作用的
Last-Modified/If-Modified-Since
與上面類似,具體請對照實驗
304
如上面所示师坎,304狀態(tài)碼出現(xiàn)在協(xié)商緩存恕酸,進行緩存內(nèi)容有效性驗證的時候。如果緩存內(nèi)容被服務(wù)端認定沒有變化屹耐,則只返回response header尸疆,并把狀態(tài)碼設(shè)置為304,并不返回response body惶岭,瀏覽器再收到304的時候寿弱,從本地的緩存中讀取內(nèi)容。如果內(nèi)容有變按灶,則返回新的header和body症革。可見鸯旁,304在緩存中的作用最后體現(xiàn)在少返回了一次內(nèi)容上噪矛。
參考資料:
http://www.telerik.com/blogs/understanding-http-304-responses
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
作者:donnylin
鏈接:http://www.reibang.com/p/b5c805f4e8d1
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處铺罢。