實現瀏覽器緩存主要有四種方式:
1)使用Cache-Control或者Expires
2)使用Last-Modified 和 If-Modified-Since
3)使用Etag和If-None-Match
4)使用html5中appcache
下面以nginx服務器為例,記錄緩存的四種方式
強制緩存:不發送請求,使用瀏覽器緩存
在http1.0中,使用Pragma?和Expires作為緩存標識,其中Expires為服務器端返回的過期時間,該用法的一個缺點是客戶端時間和服務端時間可能不一致,所以,在http1.1版本中,資源是否過期使用Cache-Control來判斷,在nginx 禁用緩存的情況下,cache-control的取值為max-age=0,代表每次請求都必須從服務端獲取資源。
當設置了max-age=3600后,瀏覽器在緩存有效范圍內會直接讀取緩存,而不是請求服務端,返回的狀態碼依然是200
對比緩存:需要與服務端進行比對判斷是否需要緩存
Last-Modified 和If-Modified-Since 大致流程如下
瀏覽器第一次返送請求,服務端返回帶有Last-Modified響應頭,當瀏覽器再次請求該資源時,發送請求帶上If-Modified-Since ,服務端收到帶有If-Modified-Since請求頭是,則與被請求資源的最后修改時間作對比,若發現資源的最后修改時間大于If-Modified-Since,則返回200,若小于If-Modified-Since,則返回304代表使用瀏覽器緩存即可。
Etag??/??If-None-Match?
Etag/If-None-Math的優先級比Last-Modified/If-Modified-Since高,其中Etag是服務器根據一定規則生成的資源的唯一標識,返回給客戶端,服務端收到If-None-Math的請求頭時,則與被請求資源的唯一標識作對比,不同則返回200,相同,則返回304
HTML5中的appcache
appcache 是html5加入的緩存方案,也是不需要請求服務端的緩存。使用步驟:
1)創建appcache文件,如app.manifest,文件內容有三欄,CACHE MANIFEST(必選)為需要緩存的文件。NETWORK(可選)是繞過緩存直接請求服務端的文件,FALLBACK(可選)為一個備用文件。實例:
CACHE MANIFEST
hello.html
demo.js
NETWORK:
*
FALLBACK:
*
entry.html文件中在html標簽中加入manifest="app.manifest",示例
清空緩存,重新刷新頁面,console控制臺開始創建緩存文件
在第二次刷新時,瀏覽器直接使用緩存