如果在回應中不存在校驗器(ETag或者Last-Modified頭信息),緩存服務器會認為缺乏直接的更新度信息,內容將會被認為不可緩存。
一個緩存的副本如果含有以下信息:內容將會被認為是足夠新的
含有完整的過期時間和壽命控制頭信息,并且內容仍在保鮮期內;
瀏覽器已經使用過緩存副本,并且在一個會話中已經檢查過內容的新鮮度;
緩存代理服務器近期內已經使用過緩存副本,并且內容的最后更新時間在上次使用期之前;
夠新的副本將直接從緩存中送出,而不會向源服務器發送請求;
如果緩存的副本已經太舊了,緩存服務器將向源服務器發出請求校驗請求,用于確定是否可以繼續使用當前拷貝繼續服務;
總之:新鮮度和校驗是確定內容是否可用的最重要途徑:
如果副本足夠新,從緩存中提取就立刻能用了;
而經緩存器校驗后發現副本的原件沒有變化,系統也會避免將副本內容從源服務器整個重新傳輸一遍。
如何控制(控制不)緩存
有很多工具可以幫助設計師和網站管理員調整緩存服務器對待網站的方式,這也許需要你親自下手對服務器的配置進行一些調整,但絕對值得;了解如何使用這些工具請參考后面的實現章節;
HTML meta標簽和HTTP 頭信息
HTML的編寫者會在文檔的區域中加入描述文檔的各種屬性,這些META標簽常常被用于標記文檔不可以被緩存或者標記多長時間后過期;
META標簽使用很簡單:但是效率并不高,因為只有幾種瀏覽器會遵循這個標記(那些真正會“讀懂”HTML的瀏覽器),沒有一種緩存代理服務器能遵循這個 規則(因為它們幾乎完全不解析文檔中HTML內容);有事會在Web頁面中增加:Pragma: no-cache這個META標記,如果要讓頁面保持刷新,這個標簽其實完全沒有必要。
如果你的網站托管在ISP機房中,并且機房可能不給你權限去控制HTTP的頭信息(如:Expires和Cache-Control),大聲控訴:這些機制對于你的工作來說是必須的;
另外一方面: HTTP頭信息可以讓你對瀏覽器和代理服務器如何處理你的副本進行更多的控制。他們在HTML代碼中是看不見的,一般由Web服務器自動生成。但是,根據 你使用的服務,你可以在某種程度上進行控制。在下文中:你將看到一些有趣的HTTP頭信息,和如何在你的站點上應用部署這些特性。
HTTP頭信息發送在HTML代碼之前,只有被瀏覽器和一些中間緩存能看到,一個典型的HTTP 1.1協議返回的頭信息看上去像這樣:
HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html
在頭信息空一行后是HTML代碼的輸出,關于如何設置HTTP頭信息請參考實現章節;
Pragma HTTP頭信息 (為什么它不起作用)
很多人認為在HTTP頭信息中設置了Pragma: no-cache后會讓內容無法被緩存。但事實并非如此:HTTP的規范中,響應型頭信息沒有任何關于Pragma屬性的說明,而討論了的是請求型頭信息 Pragma屬性(頭信息也由瀏覽器發送給服務器),雖然少數集中緩存服務器會遵循這個頭信息,但大部分不會。用了Pragma也不起什么作用,要用就使 用下列頭信息:
使用Expires(過期時間)HTTP頭信息來控制保鮮期
Expires(過期時間) 屬性是HTTP控制緩存的基本手段,這個屬性告訴緩存器:相關副本在多長時間內是新鮮的。過了這個時間,緩存器就會向源服務器發送請求,檢查文檔是否被修改。幾乎所有的緩存服務器都支持Expires(過期時間)屬性;
大部分Web服務器支持你用幾種方式設置Expires屬性;一般的:可以設計一個絕對時間間隔:基于客戶最后查看副本的時間(最后訪問時間)或者根據服務器上文檔最后被修改的時間;
Expires頭信息:對于設置靜態圖片文件(例如導航欄和圖片按鈕)可緩存特別有用;因為這些圖片修改很少,你可以給它們設置一個特別長的過期時間,這會使你的網站對用戶變得相應非???他們對于控制有規律改變的網頁也很有用,例如:你每天早上6點更新新聞頁,你可以設置副本的過期時間也是這個時間,這樣緩存 服務器就知道什么時候去取一個更新版本,而不必讓用戶去按瀏覽器的“刷新”按鈕。
過期時間頭信息屬性值只能是HTTP格式的日期時間,其他的都會被解析成當前時間“之前”,副本會過期,記?。篐TTP的日期時間必須是格林威治時間(GMT),而不是本地時間。舉例:
Expires: Fri, 30 Oct 1998 14:19:41 GMT
所以使用過期時間屬性一定要確認你的Web服務器時間設置正確,一個途徑是通過網絡時間同步協議(Network Time Protocol NTP),和你的系統管理員那里你可以了解更多細節。
雖然過期時間屬性非常有用,但是它還是有些局限,首先:是牽扯到了日期,這樣Web服務器的時間和緩存服務器的時間必須是同步的,如果有些不同步,要么是應該緩存的內容提前過期了,要么是過期結果沒及時更新。
還有一個過期時間設置的問題也不容忽視:如果你設置的過期時間是一個固定的時間,如果你返回內容的時候又沒有連帶更新下次過期的時間,那么之后所有訪問請求都會被發送給源Web服務器,反而增加了負載和響應時間;
Cache-Control(緩存控制) HTTP頭信息
HTTP 1.1介紹了另外一組頭信息屬性:Cache-Control響應頭信息,讓網站的發布者可以更全面的控制他們的內容,并定位過期時間的限制。
有用的 Cache-Control響應頭信息包括:
max-age=[秒] ― 執行緩存被認為是最新的最長時間。類似于過期時間,這個參數是基于請求時間的相對時間間隔,而不是絕對過期時間,[秒]是一個數字,單位是秒:從請求時間開始到過期時間之間的秒數。
原文轉自: http://www.mnot.net/cache_docs/