來介紹一下http中的這幾個概念
先來介紹一下Etag:
看看百度來的簡介:HTTP協議規格說明定義ETag為“被請求變量的實體值”。另一種說法是,ETag是一個可以與Web資源關聯的記號(token)。ETag(EntityTags)是URL的tag,用來標示URL對象是否改變,這樣可利用客戶端的緩存。由服務器首先產生ETag,客戶端通過將該記號傳回服務器要求服務器驗證其(客戶端)緩存。服務器使用它來判斷頁面是否已經被修改,如果未修改返回304,而不必重新傳輸整個對象。ETag由服務器端生成,客戶端通過If-Match或者說If-None-Match判斷請求來驗證資源是否修改。
所以提到這就不得不來說說另一個概念Last-Modified,表示的是服務器上此文件最后一次修改此的時間。瀏覽器會向服務器傳送If-Modified-Since報頭,詢問該時間之后文件是否有被修改過,如果未修改過那么好,直接就去取緩存,不用再次去訪問服務器獲得此資源。聽起來是不是和上述的Etag差別不太大,沒錯,Etag的出現就是要解決Last-Modified不能解決的一些問題,算是Last-Modified的升級版。來看看Last-Modified不能解決的下列問題:
1、周期性更改的文件且內容並不改變(僅僅改變的修改時間)。
2、有些文件修改極其頻繁,也許1秒內修改了很多次,If-Modified-Since能檢查到的最小單位是秒級的,所以這種修改無法判斷
3、不能精確得到文件的最后修改時間
HTTP1.1之后就出現了升級版的Etag來解決上述Last-Modified不能解決的問題。大概了解了之后我們來看看實例。
比如當我用chrome打開百度首頁時。可以按f12,我們可以用來查看頁面信息,點擊network選項,我們可以看到被請求的各資源。打開百度首頁,來看看百度logo的那張圖片。
第一次請求時,可以看到如下信息
可以看到返回的是200 ok字樣,說明此圖片被成功的從服務器上取到。並且可以看到返回了一個Etag信息 ETag:"1ec5-502264e2ae4c0"
當第二次請求百度頁面時,再去查看這兩張圖片的信息可以看到狀態碼為304。並且Request-headers返回了 If-None-Match:"1ec5-502264e2ae4c0",與Etag里的數據相匹配。
通過匹配信息,返回304,讓客戶端繼續使用本地緩存,不用再去請求服務器。
下面來說一下Expires
表示存在時間,指定了在瀏覽器上緩沖存儲的頁距過期還有多少時間。如果用戶在某個頁過期之前再次訪問,就會顯示緩存中的版本。等同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的瀏覽器可以正常使用緩存功能。
嗯,大概差不多就醬紫了。。