來介紹一下http中的這幾個概念html
看看百度來的簡介:HTTP協議規格說明定義ETag爲「被請求變量的實體值」。另外一種說法是,ETag是一個能夠與Web資源關聯的記號(token)。ETag(EntityTags)是URL的tag,用來標示URL對象是否改變,這樣可利用客戶端的緩存。由服務器首先產生ETag,客戶端經過將該記號傳回服務器要求服務器驗證其(客戶端)緩存。服務器使用它來判斷頁面是否已經被修改,若是未修改返回304,而沒必要從新傳輸整個對象。ETag由服務器端生成,客戶端經過If-Match或者說If-None-Match判斷請求來驗證資源是否修改。chrome
因此提到這就不得不來講說另外一個概念Last-Modified,表示的是服務器上此文件最後一次修改此的時間。瀏覽器會向服務器傳送If-Modified-Since報頭,詢問該時間以後文件是否有被修改過,若是未修改過那麼好,直接就去取緩存,不用再次去訪問服務器得到此資源。聽起來是否是和上述的Etag差異不太大,沒錯,Etag的出現就是要解決Last-Modified不能解決的一些問題,算是Last-Modified的升級版。來看看Last-Modified不能解決的下列問題:瀏覽器
一、週期性更改的文件且內容並不改變(僅僅改變的修改時間)。緩存
二、有些文件修改極其頻繁,也許1秒內修改了不少次,If-Modified-Since能檢查到的最小單位是秒級的,因此這種修改沒法判斷服務器
三、不能精確獲得文件的最後修改時間學習
HTTP1.1以後就出現了升級版的Etag來解決上述Last-Modified不能解決的問題。大概瞭解了以後咱們來看看實例。
ui
好比當我用chrome打開百度首頁時。能夠按f12,咱們能夠用來查看頁面信息,點擊network選項,咱們能夠看到被請求的各資源。打開百度首頁,來看看百度logo的那張圖片。spa
第一次請求時,能夠看到以下信息代理
能夠看到返回的是200 ok字樣,說明此圖片被成功的從服務器上取到。而且能夠看到返回了一個Etag信息 ETag:"1ec5-502264e2ae4c0"htm
當第二次請求百度頁面時,再去查看這兩張圖片的信息能夠看到狀態碼爲304。而且Request-headers返回了 If-None-Match:"1ec5-502264e2ae4c0",與Etag裏的數據相匹配。
經過匹配信息,返回304,讓客戶端繼續使用本地緩存,不用再去請求服務器。
表示存在時間,指定了在瀏覽器上緩衝存儲的頁距過時還有多少時間。若是用戶在某個頁過時以前再次訪問,就會顯示緩存中的版本。等同Cache-control中的max-age的效果。可是若是同時存在,則被Cache-Control的max-age覆蓋。若把其值設置爲0,則表示頁面當即過時。而且若此屬性在頁面當中被設置了屢次,則取其最小值。
一樣用上面的例子
這個使用時惟一要注意的一點是,採用的時間必須是 GMT也就是格林威治標準時間。
第三個來呢來談談Cache-control
max-age=[秒] — 執行緩存被認爲是最新的最長時間。相似於過時時間,這個參數是基於請求時間的相對時間間隔,而不是絕對過時時間,[秒]是一個數字,單位是秒:從請求時間 開始到過時時間之間的秒數。
s-maxage=[秒] — 相似於max-age屬性,除了他應用於共享(如:代理服務器)緩存
public — 標記認證內容也能夠被緩存,通常來講: 通過HTTP認證才能訪問的內容,輸出是自動不能夠緩存的;
no-cache — 強制每次請求直接發送給源服務器,而不通過本地緩存版本的校驗。這對於須要確認認證應用頗有用(能夠和public結合使用),或者嚴格要求使用最新數據 的應用(不惜犧牲使用緩存的全部好處);
no-store — 強制緩存在任何狀況下都不要保留任何副本
must-revalidate — 告訴緩存必須遵循全部你給予副本的新鮮度的,HTTP容許緩存在某些特定狀況下返回過時數據,指定了這個屬性,你高速緩存,你但願嚴格的遵循你的規則。
proxy-revalidate — 和 must-revalidate相似,除了他只對緩存代理服務器起做用(關於catch-control上面這一段源自於網上一篇優秀的博客,如今連接已經找不到了實在很差意思。。)
還有另外一篇描述很詳細的文章(http://www.cnblogs.com/cuixiping/archive/2008/05/04/1181056.html)之前是經過這些優秀博客學習的,如今分享出來,與你們共同窗習。
最後還有一個pragma。應該是與cache-control相同。可是是爲了兼容http 1.0 的。好比Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。這樣就保證了不支持http 1.1的瀏覽器能夠正常使用緩存功能。嗯,大概差很少就醬紫了。。