有些數據隨時都在變化。 CNN.com 的主頁常常幾分鐘就更新。另外一方面,Google.com 的主頁幾個星期才更新一次 (當他們上傳特殊的假日 logo,或爲一個新服務做廣告時)。 Web 服務是不變的:一般服務器知道你所請求的數據的最後修改時間,而且 HTTP 爲服務器提供了一種將最近修改數據連同你請求的數據一同發送的方法。瀏覽器
若是你第二次 (或第三次,或第四次) 請求相同的數據,你能夠告訴服務器你上一次得到的最後修改日期:在你的請求中發送一個 If-Modified-Since 頭信息,它包含了上一次從服務器連同數據所得到的日期。若是數據從那時起沒有改變,服務器將返回一個特殊的 HTTP 狀態代碼 304,這意味着 「從上一次請求後這個數據沒有改變」。這一點有何進步呢?當服務器發送狀態編碼 304 時,再也不從新發送數據。您僅僅得到了這個狀態代碼。因此當數據沒有更新時,你不須要一次又一次地下載相同的數據;服務器假定你有本地的緩存數據。緩存
全部現代的瀏覽器都支持最近修改 (last-modified) 的數據檢查。若是你曾經訪問過某頁,一天後從新訪問相同的頁時發現它沒有變化,並奇怪第二次訪問時頁面加載得如此之快——這就是緣由所在。你的瀏覽器首次 訪問時會在本地緩存頁面內容,當你第二次訪問,瀏覽器自動發送首次訪問時從服務器得到的最近修改日期。服務器簡單地返回 304: Not Modified (沒有修改),所以瀏覽器就會知道從本地緩存加載頁面。在這一點上,Web 服務也如此智能。服務器
ETag 是實現與最近修改數據檢查一樣的功能的另外一種方法:沒有變化時不從新下載數據。其工做方式是:服務器發送你所請求的數據的同時,發送某種數據的 hash (在 ETag 頭信息中給出)。hash 的肯定徹底取決於服務器。當第二次請求相同的數據時,你須要在 If-None-Match: 頭信息中包含 ETag hash,若是數據沒有改變,服務器將返回 304 狀態代碼。與最近修改數據檢查相同,服務器僅僅 發送 304 狀態代碼;第二次將不爲你發送相同的數據。在第二次請求時,經過包含 ETag hash,你告訴服務器:若是 hash 仍舊匹配就沒有必要從新發送相同的數據,由於你還有上一次訪問過的數據。ui
這幾個http頭能夠做爲meta標籤發送到客戶端,可是須要注意的是Http頭中的設置優先級更高一些,例如:
<meta. http-equiv=」Expires」 CONTENT=」 Fri, 30 Oct 1998 14:19:41″>
<meta. http-equiv=」Cache-Control」 CONTENT=」no-cache」>編碼