HTTP協議中的緩存使用

HTML文檔的<head>區域中加入描述文檔的各類屬性,這些Meta標籤經常被用於標記文檔不能夠被緩存或者標記多長時間後過時。html

當瀏覽器讀取到此HTML頁面是,會遵循這個標記,在客戶端採起針對性的緩存措施。除了直接在HTML文檔裏進行標記外,還能夠在Web服務器端進行標記。瀏覽器

在客戶端,經過瀏覽器發出第一次請求,請求某一個URL時,根據HTTP協議的規定,瀏覽器會向服務器傳送報頭(HTTP Request Header),服務器端響應同事記錄相關屬性標記(HTTP Response Header),服務器端的返回狀態會是200,格式相似以下:緩存

HTTP/1.1 200 OK
Date: Mon, 16 May 2016 04:03:15 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Tengine
Vary: Accept-Encoding
Cache-Control: must-revalidate, no-cache, private
Pragma: no-cache
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Content-Encoding: gzip

客戶端第二次請求此URL時,根據HTTP協議的規定,瀏覽器會向服務器傳送報頭(HTTP Request Header),服務器端響應請求,並查詢到標記文件沒有發生改動,服務端返回304,瀏覽器收到此狀態碼後,直接從本地緩存中讀取:服務器

HTTP/1.1 304 Not Modified
Date: Mon, 16 May 2016 04:05:08 GMT
Connection: keep-alive
Server: Tengine
Last-Modified: Tue, 05 Jan 2016 02:12:49 GMT
Etag: "568b26a1-2bca"
Expires: Wed, 15 Jun 2016 04:05:08 GMT
Cache-Control: max-age=2592000

其中Last-Modified、Expires和ETag是頁面緩存標識。網站

一、Expires(過時時間)

        HTTP控制緩存的基本手段,其告訴緩存器相關副本在多長時間內是新鮮的。過了這個時間,緩存器就會向服務器發送請求,檢查文檔是否被修改。幾乎全部緩存服務器都支持Expires屬性。Expires頭信息對於設置靜態圖片文件可緩存特別有用。由於這些圖片修改不多,你能夠給他們設置一個特別長的過時時間,這會是你的網站的用戶相應變得很是快。spa

         過時時間頭信息屬性值只能是HTTP格式的日期時間,其餘的都會被解析成當前時間「以前」,副本會過時。記住:HTTP的日期時間必須是格林威治時間(GMT),而不是本地時間。代理

例如:Expires:Fri,30 Oct 1998 14:19:41 GMTcode

二、Cache-Control

         可讓網站發佈者全面控制內容,並定位過時時間的限制。htm

         有用的Cache-Control響應頭信息包括:圖片

  • max-age = [秒]:緩存過時時間,基於請求時間相對時間間隔。
  • s-maxage = [秒]:與上面相似。不一樣的是,它應用於共享(如代理服務器)緩存
  • public:標識認證內容也能夠被緩存,通常來講,通過HTTP認證才能訪問的內容,輸出是自動不能夠緩存的。
  • no-cache:強制此請求直接發送給源服務器,而不通過本地緩存版本的校驗。這對於須要認證的應用(能夠和public結合)或者嚴格要求使用最新數據的應用。
  • no-store:強制緩存在任何狀況下都不要保留任何副本。
  • must-revalidate:若是服務器端明確指出資源的過時時間或者保鮮時間,並且聲明瞭資源的修改時間或者ETag之類的標識,那麼就有一個問題了,在保鮮時間內,若是用到了該資源,是否是要到服務器確認一下資源是否最新的?若是服務器聲明瞭must-revalidate,則每次使用該資源都須要確認資源新鮮性。
  • proxy-pevalidate:和上面相似,只對緩存代理服務器起做用。
  • Last-Modified:文檔最後修改時間

在瀏覽器第一次請求某一個URL時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個 Last-Modified的屬性標記此文件在服務器端最後被修改的時間,格式相似這樣:

Last-Modified: Tue, 05 Jan 2016 02:12:49 GMT

客戶端第二次請求此URL時,根據HTTP協議的規定,瀏覽器會向服務器傳送If-Modified-Since報頭,詢問該時間以後的文件是否有被修改過,例如:

If-Modified-Since: Tue, 05 Jan 2016 02:12:50 GMT

若是服務器端的資源沒有變化,則自動返回HTTP304(Not Changed)狀態碼,內容爲空,這樣就節省了傳輸數據量。當服務器端代碼發生改變或者重啓服務器時,則從新發出資源,返回和第一次請求時相似。從而保證不向客戶端重複發出資源,也保證當服務器有變化時,客戶端可以獲得最新的資源。


若是If-Modified-Since的時間比服務器當前時間(當前的請求時間request_time)還晚,會認爲是個非法請求。


三、ETag

ETag是服務器生成的惟一標識符,每次副本的標籤都會變化。HTTP協議規格說明定義ETag爲「被請求變量的實體標記」。

服務器響應時給請求URL標記,並在HTTP響應頭中將其傳送到客戶端,相似服務器端返回的格式,例如:

Etag: "568b26a2-88a5"

客戶端的查詢更新格式是這樣的:

Etag: "568b26a2-88a5"
If-None-Match: "568b26a2-88a5"

若是ETag沒有改變,返回狀態304。在客戶端發出請求後,HTTP Reponse Header中包含Etag: "568b26a2-88a5" 標識,等於告訴Client端,你拿到的這個資源又表示ID:"568b26a2-88a5"。下次須要發請求並索要統一個URI時,瀏覽器同時發出一個If-None-Match,此時報頭信息包含上次訪問獲得的Etag: "568b26a2-88a5"標識。

If-None-Match: "568b26a2-88a5"

這樣Client端等於緩存兩份,服務器端就會比對二者的ETag。若是 If-None-Match  爲False,不返回200,返回304(Not Modified)。

ETag和Last-Modified都能起到文檔惟一性標識的做用


  1. 不常常改變的圖片/頁面啓用緩存,使用Cache-Control:max-age屬性設置一個較長的過時時間
  2. 按期更新的內容設置一個緩存服務器可識別的max-age屬性或過時時間。
  3. 儘可能避免使用POST,除非萬不得已,POST模式的返回內容大部分緩存服務器不會保存,而若是發送內容經過URL或GET模式發送,那麼發送的內容能夠緩存下來供之後使用。
  4. 不要在URL中加入針對每一個用戶的識別信息:除非內容是針對不一樣用戶的。
相關文章
相關標籤/搜索