前段時間優化項目,設計到須要緩存靜態文件的問題,靜下心來了解了下瀏覽器的緩存機制。web
首先,不知道你們注意到沒有,HTTP請求的一下參數瀏覽器
此處,爲第一次請求緩存
response Headers 裏面注意幾個參數服務器
Expries:是HTTP 1.0的東西,如今默認瀏覽器均默認使用HTTP 1.1,因此它的做用基本忽略。優化
Etag:web服務器響應請求時,告訴瀏覽器當前資源在服務器的惟一標識(生成規則由服務器決定)。Apache中,ETag的值,默認是對文件的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後獲得的。優先級高於cache-controlspa
Last-Modified:最後修改時間設計
cache-control:Cache-Control與Expires的做用一致,優先級高於Expires。都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據仍是從新發請求到服務器取數據代理
Cache-Control | 能夠設置的值 |
Public | 響應可被任何緩存區緩存。 |
private | 對於單個用戶的整個或部分響應消息,不能被共享緩存處理。blog 這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。索引 |
no-cache | 請求或響應消息不能緩存 |
no-store | 防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存。 |
max-age | 客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。 |
min-fresh | 客戶機能夠接收響應時間小於當前時間加上指定時間的響應 |
max-stale | 指示客戶機能夠接收超出超時期間的響應消息。 若是指定max-stale消息的值,那麼客戶機能夠接收超出超時期指定值以內的響應消息。 |
Expries,cache-control 用來檢測內容是否過時,需不須要從新請求HTTP。
Last-Modified,Etag是檢測內容是否發生變化,是否須要從新返回文件。
下面咱們從新刷新,看下請求發生了什麼變化
第二次請求request 裏面多了2個字段
If-Modified-Since:當資源過時時,發現資源具備Last-Modified聲明,則再次向web服務器請求時帶上頭 If-Modified-Since,表示請求時間。web服務器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應消息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304 (無需包體,節省瀏覽),告知瀏覽器繼續使用所保存的cache。
If-None-Match:當資源過時時(使用Cache-Control標識的max-age),發現資源具備Etage聲明,則再次向web服務器請求時帶上頭If-None-Match (Etag的值)。web服務器收到請求後發現有頭If-None-Match 則與被請求資源的相應校驗串進行比對,決定返回200或304。
Last-Modified/If-Modified-Since要配合Cache-Control使用。
Etag/If-None-Match
Last-Modified/If-Modified-Since要配合Cache-Control使用。
Last-Modified 和 Etag一塊兒使用,優先使用Etag ,那麼爲何有了last-Modified ?(HTTP1.1中Etag的出現主要是爲了解決幾個Last-Modified比較難解決的問題:)
1.Last-Modified標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的修改時間所以,HTTP/1.1利用Entity Tag頭提供了更加嚴格的驗證。
2.若是某些文件會被按期生成,當有時內容並無任何變化,但Last-Modified卻改變了,致使文件無法使用緩存
3.有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形
Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的惟一標識符,可以更加準確的控制緩存。Last-Modified與ETag是能夠一塊兒使用的,服務器會優先驗證ETag,一致的狀況下,纔會繼續比對Last-Modified,最後才決定是否返回304。
緩存和用戶操做行爲有關
以上是瀏覽器的緩存機制