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