1. 程式人生 > >瀏覽器緩存

瀏覽器緩存

com 策略 無法 時間 瀏覽器 其中 機器 ctrl+ 需要

針對靜態文件,動態文件需要 web server解析

瀏覽器緩存有強緩存,協商緩存和啟發式緩存三種。

請求的基本過程,瀏覽器會先檢查cache-control和expires,看資源是否緩存過期,不過期,直接使用本地緩存,不發請求
過期,則向服務器發送請求,服務器比對If-none-match和Etag,或者If-modified-since和last-modified字段,
看資源是否發生改變,如果未改變,則返回304,body為空,否則返回200,body為文件內容。

1.強緩存

cache-control和expires設置的緩存時間,第一次請求後,文件被緩存在本地
其中cache-control優先級高於expires

返回狀態碼 200 OK (from disk cache)
或者 200 OK (from memory cache)

總之,就是 200 (from cache)

2.協商緩存

http請求的response header中有 last-modified和Etag
瀏覽器再次請求該資源時候,會在 requrest header中攜帶
If-none-match(等於上次Etag的值)
If-modifed-since(等於上次last-modified的值)
想服務發送請求,服務器對比If-none-match和Etag,If-modified-since和last-modified的值,
如果一致,則返回304狀態碼,body為空。
不一致,則返回200狀態碼,body為文件內容。

其中Etag的優先級高於last-modified

返回狀態碼 304 Not Modified

3.啟發式緩存

如果沒有cache-control和expires的緩存設置,瀏覽器依然會有一個本地緩存策略,就是啟發式緩存。
其計算方法如下:
http response header中的 Date(當前時間) 和 Last-Modified 的值

本地緩存時間 = (Date - Last-Modified) * 10%

因此,啟發式緩存的緩存時間可長可短,建議明確設置緩存時間


返回狀態碼 200 OK (與正常的無緩存請求一致,實際上使用了本地緩存,沒有發送請求)

chrome的Request Headers中會顯示一行字

Provisional(臨時的) header are shown, 表明此請求為啟發式緩存的請求。

字段解釋

Last-Modified:文件上次的修改時間

Etag:文件的唯一標識,類似於hash值

Etag解決了Last-Modified的哪些問題

1. Last-Modified的時間精確到秒級,當一個文件在1s內被多次修改,無法記錄

2. 某些文件會被周期性修改,但內容不變,此時不想利用Last-Modified的值更新緩存

3. 某些服務器不能精確得到文件的最後修改時

  http request   http respose

If-Modified-Since -> Last-Modified 時間上對比,一致則返回304

If-None-Match -> Etag 內容上對比,一致則返回304

在第一次請求URL的時候,服務器講 Last-Modified和Etag返回給客戶端
在第二次請求此URL的時候,客戶端將 If-Modified-Since 和 If-None-Match 發送到服務器
服務器將 If-Modified-Since 與 Last-Modified,If-None-Match 與 Etag做對比,一致則
返回304,否則返回200.

Expires

服務器返回的http response header中有Expires時,瀏覽器會在其標記的時間內不去下載請求的內容。
僅在地址欄輸入地址有效,F5刷新無效。

Pragma和Cahce-Control

Http1.0的Pragma和Http1.1的Cache-Control可以用來控制頁面緩存。

Pragma->no-cache, Expires->0 ,Cache-Control->no-cahce可以讓頁面不緩存。
Cache-Control的max-age可以設置頁面在客戶端緩存多少秒,是相對時間,並且覆蓋Expires

Age:代理服務的緩存時間(單位秒)
Date:響應生成的時間
Vary:Vary:Accept-Encoding,User-Agent告訴代理服務,要緩存資源的壓縮和未壓縮兩個版本

cache-contorl和pragma的no-cache設置,並不能完全禁用緩存
此設置只有部分瀏覽器支持,並且代理服務器由於不解析html文檔,完全不支持此方式

用戶行為與緩存的關系

1. 用戶在 地址欄回車,頁面鏈接跳轉,新開窗口,前進,後退時,強緩存和協商緩存均有效
2. 用戶在 F5刷新頁面,強緩存無效,協商緩存有效
3. 用戶在 ctrl+F5刷新頁面,強緩存和協商緩存均無效

分布式系統的緩存

分布式系統的多臺機器間的last-modified必須保持一致,而且盡量關閉Etag,
因為每臺機器的Etag都會不一致

服務器緩存

服務器緩存屬於共享緩存

包括

1. 代理服務器緩存

2. 源服務器緩存

3. CDN緩存

技術分享

瀏覽器緩存