瀏覽器緩存

緩存分類
緩存分爲服務器緩存(server side,好比nginx,apache)和客戶端緩存(client side,好比web browser)
服務器端緩存又分爲代理服務器緩存和反向代理服務器緩存(也叫網關緩存,好比nginx反向代理,squid等),普遍使用的cdn也是一種服務器緩存。
客戶端緩存通常指的是瀏覽器端緩存,目的是加速各類靜態資源訪問,如今的大型站點,每一個頁面隨便就是一兩百個請求,天天pv都是億級別,若是沒有緩存,用戶體驗會急劇降低,同時服務器壓力和網絡帶寬都面臨嚴重考驗。
客戶端緩存
瀏覽器緩存分爲兩種,html meta標籤以及http頭信息
html meta標籤
瀏覽器緩存機制除了http協議外,還可使用meta標籤,好比
<meta http-equiv="pragma" content="no-cache" />
上訴代碼的做用就是告訴瀏覽器當前頁面不被緩存,每次訪問都須要從新去服務器取,使用上很簡單,但只有部分瀏覽器支持,並且全部緩存代理服務器都不支持(代理服務器不解析html內容)
http信息頭
瀏覽器請求流程以下
 

 

概念講解
expires策略:expires是web服務器響應消息頭字段,在響應http請求時告訴瀏覽器在過時時間前瀏覽器能夠直接從瀏覽器緩存讀取數據,不須要再次請求,可是expires是http1.0的東西,如今瀏覽器默認使用http1.1,因此expires的做用基本能夠忽略,expires的一個缺點是,返回的到期時間是服務器端的時間,這樣就存在一個客戶端和服務器端時區不一致的狀況,會致使偏差。http1.1使用cache-control:max-age=秒來代替expires。
 
cache-control策略:與expires的做用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存讀取數據,只不過cache-control的選擇更多,設置更細緻。若是同時設置,優先級高於expires。cache-control取值能夠是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age,各個消息中的指令含義以下
Public指示響應可被任何緩存區緩存。
Private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。
no-cache指示請求或響應消息不能緩存,該選項並非說能夠設置」不緩存「,容易望文生義~
no-store用於防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存,徹底不存下來。
max-age指示客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。
min-fresh指示客戶機能夠接收響應時間小於當前時間加上指定時間的響應。
max-stale指示客戶機能夠接收超出超時期間的響應消息。若是指定max-stale消息的值,那麼客戶機能夠接收超出超時期指定值以內的響應消息。
 
Last-Modified/If-Modified-Since: Last-Modified/If-Modified-Since要配合Cache-Control使用
Last-Modified:表示這個響應資源的最後修改時間。web服務器在響應請求時,告訴瀏覽器資源的最後修改時間。
If-Modified-Since:當資源過時時(使用Cache-Control標識的max-age),發現資源具備Last-Modified聲明,則再次向web服務器請求時帶上頭 If-Modified-Since,表示請求時間。web服務器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應消息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304 (無需包體,節省瀏覽),告知瀏覽器繼續使用所保存的cache。
 
Etag/If-None-Match:Etag/If-None-Match也要配合Cache-Control使用
Etag:web服務器響應請求時,告訴瀏覽器當前資源在服務器的惟一標識(生成規則由服務器決定)。Apache中,ETag的值,默認是對文件的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後獲得的。
If-None-Match:當資源過時時(使用Cache-Control標識的max-age),發現資源具備Etage聲明,則再次向web服務器請求時帶上頭If-None-Match (Etag的值)。web服務器收到請求後發現有頭If-None-Match 則與被請求資源的相應校驗串進行比對,決定返回200或304。
 
 
既生Last-Modified 何生Etag,主要是由於etag解決了幾個last-modified不能解決的問題
  1. Last-Modified標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的修改時間
  2. 若是某些文件會被按期生成,當有時內容並無任何變化,但Last-Modified卻改變了,致使文件無法使用緩存
  3. 有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形
 
Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的惟一標識符,可以更加準確的控制緩存。Last-Modified與ETag一塊兒使用時,服務器會優先驗證ETag
 
 

 

用戶的行爲與緩存的關係
瀏覽器緩存還與用戶行爲有關係,好比ctrl+f5。
 

 備註:內容是從我的筆記裏copy出來的,目的在於交流,進步。歡迎留言討論html

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息