| 瀏覽器緩存詳解:,cache-,last-,etag詳細(xì)說(shuō)明 ||| --- | --- |最近在對(duì)CDN進(jìn)行優(yōu)化,對(duì)瀏覽器緩存深入研究了一下,記錄一下,方便后來(lái)者畫了一個(gè)草圖:![]()每個(gè)狀態(tài)的詳細(xì)說(shuō)明如下:[TOC]1、Last-在瀏覽器第一次請(qǐng)求某一個(gè)URL時(shí),服務(wù)器端的返回狀態(tài)會(huì)是200,內(nèi)容是你請(qǐng)求的資源,同時(shí)有一個(gè)Last-的屬性標(biāo)記( )此文件在服務(wù)期端最后被修改的時(shí)間,格式類似這樣:```Last-:Tue, 24 Feb 2009 08:01:04 GMT```客戶端第二次請(qǐng)求此URL時(shí),根據(jù)HTTP協(xié)議的規(guī)定,瀏覽器會(huì)向服務(wù)器傳送If--Since報(bào)頭( ),詢問(wèn)該時(shí)間之后文件是否有被修改過(guò):```If--Since:Tue, 24 Feb 2009 08:01:04 GMT```如果服務(wù)器端的資源沒(méi)有變化,則自動(dòng)返回(.)狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。
當(dāng)服務(wù)器端代碼發(fā)生改變或者重啟服務(wù)器時(shí),則重新發(fā)出資源,返回和第一次請(qǐng)求時(shí)類似。從而保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時(shí)瀏覽器工作原理是怎樣的,客戶端能夠得到最新的資源。注:如果If--Since的時(shí)間比服務(wù)器當(dāng)前時(shí)間(當(dāng)前的請(qǐng)求時(shí)間)還晚,會(huì)認(rèn)為是個(gè)非法請(qǐng)求[TOC]2、Etag工作原理HTTP協(xié)議規(guī)格說(shuō)明定義ETag為“被請(qǐng)求變量的實(shí)體標(biāo)記”(參見14.19)。簡(jiǎn)單點(diǎn)即服務(wù)器響應(yīng)時(shí)給請(qǐng)求URL標(biāo)記,并在HTTP響應(yīng)頭中將其傳送到客戶端,類似服務(wù)器端返回的格式:```Etag:“:3239″```客戶端的查詢更新格式是這樣的:```If-None-Match:“:3239″```如果ETag沒(méi)改變,則返回狀態(tài)304。即:在客戶端發(fā)出請(qǐng)求后, 中包含Etag:“:3239″標(biāo)識(shí),等于告訴端,你拿到的這個(gè)的資源有表示ID::3239。當(dāng)下次需要發(fā)索要同一個(gè)URI的時(shí)候,瀏覽器同時(shí)發(fā)出一個(gè)If-None-Match報(bào)頭(Http )此時(shí)包頭中信息包含上次訪問(wèn)得到的Etag:“:3239″標(biāo)識(shí)。
```If-None-Match:“:3239“```,這樣,端等于Cache了兩份,服務(wù)器端就會(huì)比對(duì)2者的etag。如果If-None-Match為False,不返回200,返回304(Not ) 。[TOC]3、給出的日期/時(shí)間后,被響應(yīng)認(rèn)為是過(guò)時(shí)。如:Thu, 02 Apr 2009 05:14:08 GMT需和Last-結(jié)合使用。用于控制請(qǐng)求文件的有效時(shí)間,當(dāng)請(qǐng)求數(shù)據(jù)在有效期內(nèi)時(shí)客戶端瀏覽器從緩存請(qǐng)求數(shù)據(jù)而不是服務(wù)器端.當(dāng)緩存中數(shù)據(jù)失效或過(guò)期,才決定從服務(wù)器更新數(shù)據(jù)。[TOC]4、Last-和-標(biāo)識(shí)能夠節(jié)省一點(diǎn)帶寬,但是還是逃不掉發(fā)一個(gè)HTTP請(qǐng)求出去,而且要和一起用。而標(biāo)識(shí)卻使得瀏覽器干脆連HTTP請(qǐng)求都不用發(fā),比如當(dāng)用戶F5或者點(diǎn)擊按鈕的時(shí)候就算對(duì)于有的URI,一樣也會(huì)發(fā)一個(gè)HTTP請(qǐng)求出去,所以,Last-還是要用的瀏覽器工作原理是怎樣的,而且要和一起用。
[TOC]5、Etag和如果服務(wù)器端同時(shí)設(shè)置了Etag和時(shí),Etag原理同樣,即與Last-/Etag對(duì)應(yīng)的:If--Since和If-None-Match。我們可以看到這兩個(gè)的值和發(fā)出的Last-,Etag值完全一樣;在完全匹配If--Since和If-None-Match即檢查完修改時(shí)間和Etag之后,服務(wù)器才能返回304.[TOC]6、Last-和Etag分布式系統(tǒng)里多臺(tái)機(jī)器間文件的last-必須保持一致,以免負(fù)載均衡到不同機(jī)器導(dǎo)致比對(duì)失敗分布式系統(tǒng)盡量關(guān)閉掉Etag(每臺(tái)機(jī)器生成的etag都會(huì)不一樣)Last-和ETags請(qǐng)求的http報(bào)頭一起使用,服務(wù)器首先產(chǎn)生Last-/Etag標(biāo)記,服務(wù)器可在稍后使用它來(lái)判斷頁(yè)面是否已經(jīng)被修改,來(lái)決定文件是否繼續(xù)緩存>過(guò)程如下:1.客戶端請(qǐng)求一個(gè)頁(yè)面(A)。2.服務(wù)器返回頁(yè)面A,并在給A加上一個(gè)Last-/ETag。
3.客戶端展現(xiàn)該頁(yè)面,并將頁(yè)面連同Last-/ETag一起緩存。4.客戶再次請(qǐng)求頁(yè)面A,并將上次請(qǐng)求時(shí)服務(wù)器返回的Last-/ETag一起傳遞給服務(wù)器。5.服務(wù)器檢查該Last-或ETag,并判斷出該頁(yè)面自上次客戶端請(qǐng)求之后還未被修改,直接返回響應(yīng)304和一個(gè)空的響應(yīng)體。>注:1、Last-和Etag頭都是由發(fā)出的 ,應(yīng)該同時(shí)支持這兩種頭。2、發(fā)送完Last-/Etag頭給客戶端后,客戶端會(huì)緩存這些頭;3、客戶端再次發(fā)起相同頁(yè)面的請(qǐng)求時(shí),將分別發(fā)送與Last-/Etag對(duì)應(yīng)的:If--Since和If-None-Match。我們可以看到這兩個(gè)的值和發(fā)出的Last-,Etag值完全一樣;4、通過(guò)上述值到服務(wù)器端檢查,判斷文件是否繼續(xù)緩存;[TOC]7、關(guān)于Cache-: max-age=秒 和= 時(shí)間,HTTP 1.0 版本,緩存的載止時(shí)間,允許客戶端在這個(gè)時(shí)間之前不去檢查(發(fā)請(qǐng)求)max-age = 秒,HTTP 1.1版本,資源在本地緩存多少秒。
如果max-age和同時(shí)存在,則被Cache-的max-age覆蓋。的一個(gè)缺點(diǎn)就是,返回的到期時(shí)間是服務(wù)器端的時(shí)間,這樣存在一個(gè)問(wèn)題,如果客戶端的時(shí)間與服務(wù)器的時(shí)間相差很大,那么誤差就很大,所以在HTTP 1.1版開始,使用Cache-: max-age=秒替代。=max-age + “每次下載時(shí)的當(dāng)前的時(shí)間”所以一旦重新下載的頁(yè)面后,就重新計(jì)算一次,但last-不會(huì)變化