瀏覽器快取機制

2021-09-18 04:11:09 字數 2837 閱讀 1786

分為強快取協商快取

瀏覽器在載入資源的時候,會根據這個資源的http header判斷它是否命中強快取,如果命中,就直接從快取中讀取資源,不會發請求到伺服器。

當強快取沒有命中的時候,瀏覽器一定會傳送乙個請求到伺服器,通過伺服器端一句資源的另外一些http header驗證這個資源是否命中協商快取,如果協商快取命中,伺服器會將這個請求返回,告訴客戶端可以直接從快取中載入這個資源,於是瀏覽器就又會從自己的快取中去載入這個資源。

當協商快取也沒有命中的時候,瀏覽器直接從伺服器載入資源資料。

強快取是利用expires或者cache-control這兩個http response header實現的,它們都用來表示客戶端快取的有效期,請求響應返回的狀態為200

expire:thu, 31 dec 2037 23:55:55 gmt

1)瀏覽器第一次跟伺服器請求乙個資源,伺服器在返回這個資源的同時,在response的header加上expires的header;

2)瀏覽器再請求這個資源時,先從快取中尋找,找到這個資源後,拿出它的expires跟當前的請求時間比較,如果請求時間在expire指定的時間之前,就能命中快取;

缺點

exipires是較老的強快取管理header,由於它是伺服器返回的乙個絕對時間,在伺服器時間與客戶端時間相差較大的時候,快取管理容易出現問題,比如隨意修改一下客戶端時間就能影響快取命中的結果。

cache-control: max-age = 315360000

1)瀏覽器第一次跟伺服器請求乙個資源,伺服器在返回這個資源的同時,在response的header加上cache-control的header;

2)瀏覽器在接收到這個資源後,會把這個資源連同所有response header一起快取下來

3)瀏覽器再請求這個資源時,先從快取中尋找,找到這個資源後,根據它第一次的請求時間和cache-control設定的有效期,計算出乙個資源過期時間,再拿這個過期時間跟當前的請求時間比較,如果請求時間再過期時間之前,就能命中快取;

前者描述的是絕對時間,後者是相對時間

可以只啟用乙個,也可以同時啟用,同時存在時,cache-control優先順序高於expire

1)通過**方式,在web伺服器返回的相應中新增expires和cache-control header;

2)通過配置web伺服器的方式,讓web伺服器在響應資源的時候統一新增expires和cache-control header

請求響應返回的狀態為304並且會顯示乙個not modified的字串,協商快取是利用的是last-modified,if-modified-since和etag,if-none-match這兩對header來管理的

last-modified: tue, 12 jan 2016 03:08:53 gmt

if-modified-since: tue, 12 jan 2016 03:08:53 gmt

1)瀏覽器第一次跟伺服器請求乙個資源,伺服器在返回這個資源的同時,在respone的header加上last-modified的header,這個header表示這個資源在伺服器上的最後修改時間;

2)瀏覽器再次跟伺服器請求這個資源時,在request的header上加上if-modified-since的header,這個header的值就是上一次請求時返回的last-modified的值;

3)伺服器再次收到資源請求時,根據瀏覽器傳過來if-modified-since和資源在伺服器上的最後修改時間判斷資源是否有變化,如果沒有變化則返回304 not modified,但是不會返回資源內容;如果有變化,就正常返回資源內容。當伺服器返回304 not modified的響應時,response header中不會再新增last-modified的header,因為既然資源沒有變化,那麼last-modified也就不會改變,這是伺服器返回304時的response header;

4)瀏覽器收到304的響應後,就會從快取中載入資源;

缺點:

有時候伺服器上資源其實有變化,但是最後修改時間卻沒有變化,而這種問題又很不容易被定位出來,而當這種情況出現的時候,就會影響協商快取的可靠性

etag: "17fd8-5291a5f96fd20"

1)瀏覽器第一次跟伺服器請求乙個資源,伺服器在返回這個資源的同時,在respone的header加上etag的header,這個header是伺服器根據當前請求的資源生成的乙個唯一標識,這個唯一標識是乙個字串,只要資源有變化這個串就不同,跟最後修改時間沒有關係,所以能很好的補充last-modified的問題;

2)瀏覽器再次跟伺服器請求這個資源時,在request的header上加上if-none-match的header,這個header的值就是上一次請求時返回的etag的值;

3)伺服器再次收到資源請求時,再根據資源生成乙個新的etag,與瀏覽器傳過來if-none-match比較,如果這兩個值相同就說明資源沒有變化,否則就是有變化;如果沒有變化則返回304 not modified,但是不會返回資源內容;如果有變化,就正常返回資源內容。與last-modified不一樣的是,當伺服器返回304 not modified的響應時,由於etag重新生成過,response header中還會把這個etag返回,即使這個etag跟之前的沒有變化

4)瀏覽器收到304的響應後,就會從快取中載入資源。

注意的問題

分布式系統裡多台機器間檔案的last-modified必須保持一致,以免負載均衡到不同機器導致比對失敗;

分布式系統盡量關閉掉etag(每台機器生成的etag都會不一樣);

瀏覽器快取機制

最近在準備優化日誌請求時遇到了一些令人疑惑的問題,比如為什麼響應頭里出現了兩個 cache control 為什麼明明設定了 no cache 卻還是發請求,為什麼多次訪問時有時請求裡帶了 etag,有時又沒有帶?等等。後來查了一些資料以及同事親自驗證,總算對這些問題有了個清晰的理解,現在整理出來以...

瀏覽器快取機制

當我們瀏覽乙個頁面發現有異常時,通常考慮的就是書不是瀏覽器做了快取呢,按ctrl f5重新請求一次就能請求到沒有快取的頁面,這個是為什麼呢。首先,ctrl f5組合鍵重新整理頁面,那麼瀏覽器會直接向目標url傳送請求,而不再使用瀏覽器快取的資料。其次,當請求到達伺服器端依然有可能出現使用伺服器端的資...

瀏覽器快取機制

瀏覽器快取機制 瀏覽器快取機制,其實主要就是 協議定義的快取機制 如 expires cache control 等 但是也有非 協議定義的快取機制,如使用 html meta 標籤,web 開發者可以在 html 頁面的節點中加入 標籤,如下 上述 的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需...