1.1 瀏覽器的緩存應(yīng)用
1.1.1 概述
游覽器緩存可以有效的解決同一客戶端用戶的多次訪問的快速響應(yīng)問題。一個(gè)客戶可能多次訪問同一個(gè)頁面,使用了瀏覽器緩存,直接可以從客戶的本地獲取緩存的數(shù)據(jù),從而可以有效減少用戶的訪問次數(shù),從而減輕服務(wù)器的負(fù)擔(dān)。最常用的是對于圖片,JS,CSS, HTML等靜態(tài)資源實(shí)現(xiàn)瀏覽器級別的緩存。
1.1.2 瀏覽器緩存的結(jié)構(gòu)
瀏覽器的緩存是基于HTTP請求包。一個(gè)HTTP的響應(yīng)包中包含如下的頭信息。該響應(yīng)頭中列出了緩存相關(guān)的幾個(gè)重要的幾個(gè)字段。
HTTP/1.x 200 OK
Server: Microsoft-IIS/7.5
Last-Modified: Thu, 31 Dec 2009 09:29:09 GMT
Etag: "e46de5b4fb89ca1:0"
Expires: Thu, 07 Jan 2010 00:00:00 GMT
Cache-Control: max-age=10
其中Last-Modified, Etag和Expires,Cache-Control是和瀏覽器的緩存和緩存處理密切相關(guān)的四個(gè)字段。前兩個(gè)字段是條件緩存控制參數(shù),瀏覽器會根據(jù)這兩個(gè)字段的值向服務(wù)器發(fā)送一個(gè)請求,詢問所需的資源是否已經(jīng)更改,如果沒有更改直接使用本地文件,否則重新從服務(wù)器下載。主要可以減少服務(wù)器的流量,但是不會減少請求數(shù)。后兩個(gè)這是緩存時(shí)間設(shè)定參數(shù),只有設(shè)定了過期參數(shù)的頁面,瀏覽器會先查看是否過期,如果沒有過期直接使用本地緩存,不再向服務(wù)器請求。如果已經(jīng)過期才向服務(wù)器發(fā)送請求。
Last-Modified:指定被請求資源上次被修改的日期和時(shí)間。例如:Last-Modified: Mon,10PR 18:42:51 GMT
Etag:一種實(shí)體頭標(biāo),它向被發(fā)送的資源分派一個(gè)唯一的標(biāo)識符。
Expires:指定實(shí)體的有效期。例如:Expires: Mon,05 Dec 2008 12:00:00 GMT
Cache-Control:一個(gè)用于定義緩存指令的通用頭標(biāo)。例如:Cache-Control: max-age=30。
1.1.3 瀏覽器的緩存請求過程
當(dāng)瀏覽器第一次請求某個(gè)URL時(shí),順利訪問的話,服務(wù)器返回狀態(tài)200的狀態(tài), 同時(shí)會返回給瀏覽器一些Headers集合,如果設(shè)定只是設(shè)定了Last-Modified和Etag頭信息,那么瀏覽器接收到服務(wù)器這些信息后,就會將資源緩存在本地目錄中,同時(shí)保存文件的上述信息. 第二次請求時(shí),根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務(wù)器傳送 If-Modified-Since 與 If-None-Match 報(bào)頭這兩個(gè)報(bào)頭實(shí)際上是第一次請求時(shí)服務(wù)器返回的Last-Modified,Etag.發(fā)送這兩個(gè)報(bào)頭目地是詢問服務(wù)器,該資源在時(shí)間內(nèi)有沒有被修改過。如 果該資源未被修改,則服務(wù)器會直接返回HTTP 304 (Not Changed.)狀態(tài)碼,內(nèi)容為空,此時(shí)不會下載資源,瀏覽器則自動(dòng)從緩存目錄中讀取資源。使用Last-Modified和Etag 可以減少傳輸成本,但不會減少http請求數(shù)量。如果給文件加上關(guān)于過期時(shí)間(Expires)的header報(bào)文,這樣瀏覽器就會先檢查緩存中的文件,如果沒有過期,就直接使用緩存中的文件,從而不會 發(fā)送http請求。
1.1.4 瀏覽器的不同請求方式
瀏覽器請求包括普通頁面請求(鏈接點(diǎn)擊跳轉(zhuǎn),用JS腳本打開新頁面,使用IFRAME時(shí))。F5刷新時(shí)和Ctrl+F5三種方式。在1.1.3中描述的是對于普通頁面請求的情況。F5刷新忽略緩存的過期設(shè)定,每次發(fā)送請求到服務(wù)器端。而CTRL + F5則是與無緩存時(shí)效果一樣處理,強(qiáng)制重新下載。
1.1.5 設(shè)定瀏覽器緩存
當(dāng)前常用的應(yīng)用服務(wù)器,都可以對于一般的純靜態(tài)頁面,如HTML、GIF、JPG、CSS、JS等頁面進(jìn)行緩存頭信息的設(shè)定。例如Apache服務(wù)器會對自動(dòng)讀取靜態(tài)文件中的Last-Modified字段添加到HEADER中,并且會對所有的頁面(包括動(dòng)態(tài)頁面)加上ETag信息到HEADER。也可以使用FILTER動(dòng)態(tài)的對于需要的頁面加入這些緩存HEADER的添加,增加瀏覽器的緩存的使用。