HTTP的請求頭 Last-Modified 與 If-Modified-Since 和 If-None-Match 與 ETags
Last-Modified 與If-Modified-Since 都是用於記錄頁麵最後修改時間的 HTTP 頭信息.
Last-Modified 是由服務器往客戶端發送的 HTTP 頭
If-Modified-Since
則是由客戶端往服務器發送的頭
再次請求本地存在的 cache 頁麵時,客戶端會通過 If-Modified-Since 頭將先前服務器端發過來的 Last-Modified 最後修改時間戳發送回去,
這是為了讓服務器端進行驗證,通過這個時間戳判斷客戶端的頁麵是否是最新的,
如果不是最新的,則返回新的內容,
如果是最新的,則 返回 304 告訴客戶端其本地 cache 的頁麵是最新的,
於是客戶端就可以直接從本地加載頁麵了,這樣在網絡上傳輸的數據就會大大減少,同時也減輕了服務器的負擔
If-None-Match,它和ETags(HTTP協議規格說明定義ETag為“被請求變量的實體值”,或者是一個可以與Web資源關聯的記號)常用來判斷當前請求資源是否改變。類似於Last-Modified和HTTP-IF-MODIFIED-SINCE。但是有所不同的是Last-Modified和HTTP-IF-MODIFIED-SINCE隻判斷資源的最後修改時間,而ETags和If-None-Match可以是資源任何的任何屬性,不如資源的MD5等。
ETags和If-None-Match的工作原理是在HTTP Response中添加ETags信息。當客戶端再次請求該資源時,將在HTTP Request中加入If-None-Match信息(ETags的值)。如果服務器驗證資源的ETags沒有改變(該資源沒有改變),將返回一個304狀態;否則,服務器將返回200狀態,並返回該資源和新的ETags。
ETag如何幫助提升性能?
聰明的服務器開發者會把ETags和GET請求的“If-None-Match”頭一起使用,這樣可利用客戶端(例如瀏覽器)的緩存。因為服務器首先產生ETag,服務器可在稍後使用它來判斷頁麵是否已經被修改。本質上,客戶端通過將該記號傳回服務器要求服務器驗證其(客戶端)緩存。
其過程如下:
1.客戶端請求一個頁麵(A)。
2.服務器返回頁麵A,並在給A加上一個ETag。
3.客戶端展現該頁麵,並將頁麵連同ETag一起緩存。
4.客戶再次請求頁麵A,並將上次請求時服務器返回的ETag一起傳遞給服務器。
5.服務器檢查該ETag,並判斷出該頁麵自上次客戶端請求之後還未被修改,直接返回響應304(未修改——Not Modified)和一個空的響應體。
https://li-bonan.blog.163.com/blog/static/135564770201291725720582/
最後更新:2017-04-03 14:54:06