http 的緩存都是從資源的第二次請求開始的,由於首次請求都是新的資源。瀏覽器
瀏覽器 http 緩存能夠分爲強緩存和協商緩存。緩存
強緩存和協商緩存的區別是:服務器
下表所列緩存按照優先級進行排序:代理
字段名稱 | 字段分類 |
---|---|
Pragma | 請求頭&響應頭 |
Cache-Control | 請求頭&響應頭 |
Expires | 響應頭 |
If-None-Match / ETag | 請求頭 / 響應頭 |
If-Modified-Since / Last-Modified | 請求頭 / 響應頭 |
強緩存在未失效的狀況下(即 Cache-Control 的值沒有過時或者 Expires 的緩存時間沒有過時),那麼就會直接使用瀏覽器的緩存數據,不會再向服務器發送任何請求。強制緩存生效時,http 狀態碼爲 200。對象
Pragma 是一個在 HTTP/1.0 中規定的通用首部,它在響應頭的行爲沒有規範,依賴於瀏覽器的實現,建議只在須要兼容 HTTP/1.0 客戶端的場合下應用。參數只有一個:no-cache,會通知瀏覽器不直接使用強緩存,由於它優先級最高,當存在時必定不會命中強緩存。排序
Cache-Control 也是 HTTP/1.1 控制瀏覽器緩存的主流字段,被用於在請求和響應中。請求頭和相應頭指令略有不一樣,這裏列舉幾個常見的指令:內存
Expires 是一個響應首部字段,它指定了一個日期/時間(值爲GMT時間,即格林尼治時間),在這個時間/日期以前,緩存被認爲是有效的。若是在 Cache-Control 響應頭設置了 "max-age" 或者 "s-max-age" 指令,那麼 Expires 頭會被忽略。資源
當 Cache-Control 和 Expires 過時或者 Cache-Control 的屬性設置爲 no-cache 時,那麼此時瀏覽器就會發送請求與服務器進行協商,服務器端對比判斷資源是否進行了修改更新。若是資源沒有修改,那麼就會返回 304 狀態碼,告訴瀏覽器可使用緩存中的數據,減小服務器的數據傳輸壓力。字符串
ETag 是一個響應首部字段,它是根據實體內容生成的一段hash字符串,標識資源的狀態,由服務端產生。If-None-Match 是相應的請求頭字段。當與 If-Modified-Since 一同使用的時候,If-None-Match 優先級更高hash
Last-Modified 是一個響應首部字段,包含該資源上次修改的時間。 If-Modified-Since 是相應的請求頭字段。
當瀏覽器第一次向服務器發送請求時,會在響應頭中返回協商緩存的屬性:ETag 和 Last-Modified,而後瀏覽器在第二次發送請求的時候,會在請求頭中帶上與 ETag 對應的 If-Not-Match,其值就是響應頭中返回的 ETag 的值,Last-Modified 對應的 If-Modified-Since。服務器在接收到這兩個參數後會作比較,若是返回的是304狀態碼,則說明請求的資源沒有修改,瀏覽器能夠直接在緩存中取數據,不然,服務器會直接返回數據。
當瀏覽器觸發強緩存時,咱們會看到資源會顯示 from memory cache 或者 from disk cache 的字樣,正常狀況下,當咱們這在訪問頁面時,資源會從內存中加載,即 from memory cache,若是咱們關閉瀏覽器,而後重新打開頁面,就會從磁盤加載該文件(前提是都觸發了強緩存),即 from disk cache,當咱們再次刷新是,資源又會被放到內存裏了。