天天看點

浏覽器HTTP緩存原理分析(轉)浏覽器緩存原理緩存相關首部字段緩存配置的一些注意事項

章節目錄

<a href="#_h1_0">浏覽器緩存原理</a>

<a href="#_h2_1">文字版描述</a>

<a href="#_h2_2">一圖以蔽之</a>

<a href="#_h1_3">緩存相關首部字段</a>

<a href="#_h2_4">request緩存相關首部字段</a>

<a href="#_h2_5">response緩存相關首部字段</a>

<a href="#_h2_6">實體首部緩存相關字段</a>

<a href="#_h1_7">緩存配置的一些注意事項</a>

以前項目中遇到了很多浏覽器緩存相關的問題,也在網上查過資料,搞過伺服器的配置,來確定用戶端加載伺服器資源的速度和資源有效性。最近仔細看了下http協定中和緩存相關的一些屬性,總結一下。

<a></a>

①浏覽器第一次通路伺服器資源 /index.html

在浏覽器中沒有緩存檔案,直接向伺服器發送請求。

伺服器傳回  200 OK,實體中傳回 index.html檔案内容,并設定一個緩存過期時間,一個檔案修改時間,一個根據index.html内容計算出來的實體标記Entity Tag,簡稱Etag。

浏覽器将/index.html路徑的請求緩存到本地。

②浏覽器第二次通路伺服器資源 /index.html

由于本地已經有了此路徑下的緩存檔案,是以這一次就不直接向伺服器發送請求了。

首先,進行緩存過期判斷。浏覽器根據①中設定緩存過期時間判斷緩存檔案是否過期。

情景一:若沒有過期,則不向伺服器發送請求,直接使用緩存中的結果,此時我們在浏覽器控制台中可以看到  200 OK(from cache) ,此時的情況就是完全使用緩存,浏覽器和伺服器沒有任何互動的。

情景二:若已過期,則向伺服器發送請求,此時請求中會帶上①中設定的檔案修改時間,和Etag

然後,進行資源更新判斷。伺服器根據浏覽器傳過來的檔案修改時間,判斷自浏覽器上一次請求之後,檔案是不是沒有被修改過;根據Etag,判斷檔案内容自上一次請求之後,有沒有發生變化

情形一:若兩種判斷的結論都是檔案沒有被修改過,則伺服器就不給浏覽器發index.html的内容了,直接告訴它,檔案沒有被修改過,你用你那邊的緩存吧—— 304 Not Modified,此時浏覽器就會從本地緩存中擷取index.html的内容。此時的情況叫協定緩存,浏覽器和伺服器之間有一次請求互動。

情形二:若修改時間和檔案内容判斷有任意一個沒有通過,則伺服器會受理此次請求,之後的操作同①

我的文字表達能力可能有限,為了盡量把這個流程描述清楚一點,下面

浏覽器HTTP緩存原理分析(轉)浏覽器緩存原理緩存相關首部字段緩存配置的一些注意事項
浏覽器HTTP緩存原理分析(轉)浏覽器緩存原理緩存相關首部字段緩存配置的一些注意事項
浏覽器HTTP緩存原理分析(轉)浏覽器緩存原理緩存相關首部字段緩存配置的一些注意事項

① cache-control  用來做緩存過期判斷

常用指令:

no-cache  不直接使用緩存,始終向伺服器發起請求

max-age  緩存過期時間,是一個時間數值,比如3600秒,設定為0的時候效果等同于no-cache

s-maxage  給緩存代理用的指令,對直接傳回資源的server無效,當s-maxage生效時,會忽略max-age的值

only-if-cached 若有緩存,則隻使用緩存,若緩存檔案出問題了,請求也會出問題

② Pragma  用來做緩存過期判斷

   它可以取值no-cache

   這是一個http1.0遺留的字段,當它和cache-control同時存在的時候,會被cache-control覆寫

③ if-match / if-none-match  用來做資源更新判斷

   這個指令會把緩存中的Etag傳給伺服器,伺服器用它來和伺服器端的資源Etag進行對比,若不一緻則證明資源被修改了,需要響應請求為 200 OK

④ if-modified-since  用來做資源更新判斷

    這個指令會把檔案的上一次緩存中的檔案的更新時間傳給伺服器,伺服器判斷檔案在這個時間點後是否被修改,如果被修改過則需要響應請求為200 OK

浏覽器HTTP緩存原理分析(轉)浏覽器緩存原理緩存相關首部字段緩存配置的一些注意事項

① cache-control  用來設定緩存過期時間

no-cache  讓用戶端不直接使用緩存,始終向伺服器發起請求,不設定預設是這個,上邊截圖中的請求就是省略了,是以用戶端不會直接使用緩存。

private/public  預設是private,隻在一個浏覽器中緩存,設定為public時緩存可被多個使用者共享

② Etag 用來設定根據資源内容生成的實體标簽

    這個值有強tag和弱tag,差別是計算方式不同,隻有強tag才會在資源被更新的時候立即發生變化,請求首部中的if-match/if-none-match字段就會傳回這個值給服務端

③ age

   這個字段用來告訴用戶端,這個response是在多久前被建立的,機關為秒,緩存伺服器傳回資源的時候必須建立此字段

response的head裡邊可能還包括實體首部,實體首部是緊跟在response首部後邊的。

①last-modified-time ——用來設定資源最後修改時間

②Exprire —— 設定檔案過期時間

  這個字段的作用和cache-control相同,不同的是它直接指定一個緩存過期時間點,容易受用戶端時間的影響。

  這也是一個遺留的字段,和cache-control同時存在的時候會被後者覆寫

① 隻有get請求會被緩存,post請求不會

② Etag 在資源分布在多台機器上時,對于同一個資源,不同伺服器生成的Etag可能不相同,此時就會導緻304協定緩存失效,用戶端還是直接從server取資源。可以自己修改伺服器端etag的生成方式,根據資源内容生成同樣的etag。

③ 系統上線,更新資源時,可以在資源uri後邊附上資源修改時間、svn版本号、檔案md5 等資訊,這樣可以避免使用者下載下傳到緩存的舊的檔案

④ 觀察chrome的表現發現,通過連結或者位址欄通路,會先判斷緩存是否過期,再判斷緩資源是否更新;F5重新整理,會跳過緩存過期判斷,直接請求伺服器,判斷資源是否更新。

目前隻能回憶起這些了,以後遇到了再補充吧~

http://www.cnblogs.com/tzyy/p/4908165.html

繼續閱讀