一。背景介紹
瀏覽器緩存是為了節約網絡的資源加載速度,瀏覽器在用戶磁盤上對最近所請求過的文檔進行存儲,當用戶再次請求這個頁面時,瀏覽器直接從用戶磁盤顯示文檔,這樣就可以加速頁面的加載。瀏覽器緩存主要有兩類:緩存協商:Last-modified,Etag和徹底緩存:cache-control,Expires。
二。知識剖析
1.強緩存
服務器通過設置http中的header的Expires和cach-control字段告訴瀏覽器緩存的有效期
Expires是Web服務器響應消息頭字段,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據,而無需再次請求。
Expires的值是GMT格式的絕對時間,在設置的時間前瀏覽器會直接使用本地緩存。
cache-control有12個值,其中的max-age值定義緩存的有效期,單位是秒,例如:cach-control:max-age=700,它表示緩存有效期為700秒,以消息的生成日期為基准,也就是header中的Date字段。
cache-control與Expires的區別在於cache-control的值是相對時間,而Expires是絕對時間,如果我們人為的修改了本地的時間,那么此時本地的時間與服務器上的時間不一致,就會導致緩存不能正確得被使用;而如果用相對時間,不管怎么改變本地時間,緩存的有效期都不會改變。
2.協商緩存
簡單地說,協商緩存就是通過服務器來判斷緩存是否可用。
Last-Modified:表示這個響應資源的最后修改時間,web服務器在響應請求時,告訴瀏覽器資源的最后修改時間。
If-Modified-Since:當資源過期時(使用cache-control標識的max-age),發現資源具有Last-Modified聲明,則再次向web服務器請求時帶上If-Modified-Since,表示請求時間。web服務器收到請求后發現有頭If-Modified-Since則與被請求資源的最后修改時間進行對比。若最后修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在相應消息包體內),HTTP 200;若最后修改時間較舊,說明資源無新修改,則響應HTTP304(無需包體,節省瀏覽),告知瀏覽器繼續使用所保存的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),發現資源具有Etag聲明,則再次向web服務器請求時帶上頭If-None-Match(Etag的值)。web服務器收到請求后發現有頭If-None-Match則與被請求資源的相應校驗串進行對比,決定返回200或304。
三。常見問題
Q:Etag與Last-Modified有什么區別?
A:Etag更傾向於標識資源是否有變更,而Last-Modified更傾向於含有時間狀態的數據
Q:如果Etag和Last-Modified同時存在,服務器會先檢測哪一個?
A:服務器會先檢測Etag再去檢測Last-Modified,因為Etag發生改變的話那么資源的內容一定發生了變化,而Last-Modified發生了變化資源內容不一定發生改變
Q:cache-control和Expries的區別?
A:cache-control用於控制HTTP緩存,Expires表示存在時間,允許客戶端在這個時間之前不去發請求,等同於max-age的效果。但是如果同時存在,則被cache-control的max-age覆蓋。
