瀏覽器緩存學習筆記

簡介

瀏覽器是存在緩存的,一般會在用戶的文件系統中創建一個目錄用於存放緩存文件,其目的是減少服務器端的網絡開銷,提高用戶訪問速度。這種緩存主要分兩種:

1、需要和服務器交互(緩存協商),比如Last-Modified和ETag;

2、不需要和服務器交互,比如Expires和Cache-Control.

Last-Modified

Last-Modified的原理是服務器向瀏覽器返回一個最後修改時間,瀏覽器下次請求時詢問服務器在這個時間之後是否有更新,服務器獲取到文件的最後修改時間反饋給瀏覽器。一般將Last-Modified與If-Modified-Since配合使用。可以用httpWatch觀察響應狀態碼,如果爲304 Not Modified意味着這個內容沒有更新,瀏覽器可以使用本地緩存的內容,同時,服務器不會將內容的正文傳給瀏覽器;如果爲200 OK,則需要重新請求動態內容。

對於靜態文件很容易獲取最後修改時間,對於動態內容,web服務器無能爲力,需要動態程序來完成,然後告訴web服務器。

Last-Modified在以下場合不適用:

1、有些時候雖然文件頻繁更新,但文件內容沒有更新;

2、同一個文件在多個服務器上都有副本,實現負載均衡,這些文件的修改時間未必都相同;

3、修改時間不願意暴露給客戶端時,修改時間是敏感信息。

ETag

ETag全稱爲實體標籤緩存驗證器(Entity Tag Cache Validators),也是一種瀏覽器與web服務器的驗證機制,只不過比Last-Modified更爲靈活一些。HTTP/1.1中並沒有規定ETag的具體格式,只是要一串編碼即可,開發人員可以自由定義,可以是最後修改時間、也可以是請求內容的md5編碼、也可以是某個hash函數的計算結果等。要配合If-None-Match來實現,具體步驟如下:

1、客戶端請求一個頁面;

2、服務器返回,並加上一個ETag(一串字符,類似token);

3、客戶端展現該頁面,並將頁面連同ETag一起緩存;

4、客戶再次請求這個頁面,並將上次請求時服務器返回的ETag一起傳遞給服務器;

5、服務器檢查該ETag,並判斷出該頁面自上次客戶端請求之後還未被修改,直接返回響應304 Not Modified和一個空的響應體.

注意服務器端產生ETag和校驗都是需要開銷的,往往比Last-Modified要大一些。開啓ETag需要消耗性能,但ETag本身會減少服務器端請求,這裏面需要權衡。

Expires

HTTP緩存的最終目的是要徹底消滅不必要的請求,Expires就是其中一種實現方案。它告訴瀏覽器該內容在何時過期,暗示瀏覽器在該內容過期之前不需要詢問服務器,而直接使用本地緩存即可。

Expires明顯比Last-Modified有更大的權力,完全可以自作主張,減少與服務器端交互,但其有一個硬傷:通過Expires指定的過期時間來自web服務器的系統時間,用戶本地時間與服務器時間一般是不一致的,如果相差太多,影響到本地緩存的有效期檢查。

Cache-Control

HTTP/1.1中還有一個標記Cache-Control用於彌補Expires的不足,其格式爲Cache-Control:max-age=,max-age指定了緩存過期的相對時間,單位是秒。

如果HTTP響應頭中同時含有Expires和Cache-Control時,瀏覽器會優先考慮Cache-Control,對於沒有Cache-Control的情況,瀏覽器則會服從Expires的指示。

頁面請求方式與瀏覽器緩存

1、轉到/GO/地址欄直接請求

這種方式瀏覽器支持緩存協商,對沒有過期的內容使用本地緩存,Expires標記在這種訪問方式下也有效。

2、F5/刷新

按F5鍵或者點擊瀏覽器的刷新按鈕,允許Last-Modified/ETag這種與服務器協商方式利用緩存,但對Expires無效。

3、Ctrl+F5

強制刷新,不使用緩存,直接獲取頁面最新版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章