瀏覽器快取控制

2021-09-27 02:44:32 字數 3887 閱讀 4294

瀏覽器快取控制

last-modified/if-modified-since(validation)

在瀏覽器第一次請求某乙個url時,伺服器端的返回狀態碼200,內容是客戶端請求的資源,同時有乙個last-modified的屬性標記此檔案在伺服器端最後被修改的時間。

客戶端第二次請求此url時,根據http協議的規定,瀏覽器會向伺服器傳送if-modified-since報頭,詢問該時間之後檔案是否有被修改過:

if-modified-since : fri , 12 may 2006 18:53:33 gmt

如果伺服器端的資源沒有變化,則自動返回 304(not changed.)狀態碼,內容為空,這樣就節省了傳輸資料量。

當伺服器端**發生改變或者重啟伺服器時,則重新發出資源,返回和第一次請求類似。從而保證不向客戶端重**出資源,也保證當伺服器有變化時,客戶端能夠得到最新的資源。

last-modified的問題

1、一些檔案會被編輯,但內容並未改變,這個時候不希望客戶端認為這個檔案被修改了,而重新獲取資源。

2、某些檔案修改非常頻繁,比如在秒以下的時間內進行修改,if-modified-since無法檢查到。

3、某些伺服器不能精確的得到檔案的最後修改時間。

expires(freshness)

expires用來控制快取失效的日期。當瀏覽器看到響應中有乙個expires頭時,它會和相應的元件一起儲存到其快取中,只要元件沒有過期,瀏覽器就會使用快取版本而不會進行任何的http請求。長久的expires頭適用於等不經常更新的資源。expires設定的日期格式必須為gmt(格林尼治標準時間)。expires既適用於 http1.0,也適用於 http1.1。

expires:wed, 11 jan 2017 08:10:26 gmt

因為請求根本沒有產生,所以在chrome下請求頭部會顯示:provisional headers are shown狀態碼為200 ok (from cache) 。

expires的不足:

首先,expires頭使用的是乙個特定的時間,要求客戶端和伺服器端的時鐘嚴格同步。如果伺服器和客戶端的時間不統一,這有可能出現快取提前失效的情況,存在不穩定性。其次,假如expires的日期到來,需要在伺服器配置中再提供乙個新的日期。

cache-control(freshness)

http1.1引入了cache-control頭來克服expires頭的不足。cache-control使用max-age制定元件被快取多久,以秒為單位。例如

cache-control:max-age=3600表示元件將被快取60分鐘。

如果max-age和expires同時出現,則max-age有更高的優先順序,瀏覽器會根據max-age的時間來確認快取過期時間。若快取新鮮,則不傳送請求直接使用快取。

常用cache-directive

cache-directive

說明

public

所有內容都將被快取(客戶端和**伺服器都可快取)

private

內容只快取到私有快取中(僅客戶端可以快取,**伺服器不可快取),預設值

no-cache

do-not-serve-from-cache-without-revalidation:可以被快取,但是在與伺服器進行驗證之前不能供客戶端使用。如果存在合適的驗證令牌 (etag),no-cache 會發起往返通訊來驗證快取,如果資源未被更改,可以直接使用。

no-store

所有內容都不會被快取到快取或 internet 臨時檔案中

must-revalidation/proxy-revalidation

如果快取的內容失效,請求必須傳送到伺服器/**以進行重新驗證

max-age=*** (*** is numeric)

快取內容的有效時間長度,將在 *** 秒後失效, 這個選項只在http 1.1可用。如果和last-modified並存時, 優先順序更高。值為0時每次都從伺服器獲取資源。

瀏覽器的不同操作

開啟新視窗

如果指定cache-control的值為private、no-cache、must-revalidate,那麼開啟新視窗訪問時都會重新訪問伺服器。而如果指定了max-age值,那麼在此值內的時間裡就不會重新訪問伺服器,例如:cache-control: max-age=5 表示當訪問此網頁後的5秒內不會去再次訪問伺服器.

在位址列回車

如果值為private或must-revalidate,則只有第一次訪問時會訪問伺服器,以後就不再訪問。如果值為no-cache,那麼每次都會訪問。如果值為max-age,則在過期之前不會重複訪問。

按後退按扭

如果值為private、must-revalidate、max-age,則不會重訪問,而如果為no-cache,則每次都重複訪問.

按重新整理按扭

無論為何值,都會重複訪問.

etag(entity tag)(validation)

伺服器在檢測快取的元件是否和原始伺服器上的元件匹配時有兩種方法:

(1)比較最近修改日期;last-modified/if-modified-since

(1)比較實體標籤;etag/if-none-match(優先順序比if-modified-since高)

實體標籤,是web伺服器和瀏覽器用於確認快取元件的有效性的一種機制。

etag:"50b1c1d4f775c61:df3"

第一次請求時:

1.客戶端發起http get 請求乙個資源;

2.伺服器處理請求,返回資源,包括http etag和狀態碼200

第二次請求時:

1.客戶端發起 http get 請求乙個檔案,請求中包括乙個if-none-match頭,內容就是第一次請求時伺服器返回的etag的值

2.伺服器判斷接受到的etag和計算出來的etag是否匹配。若匹配,返回304狀態碼,客戶端繼續使用本地的快取。若不匹配,返回資源和新的etag。

etag帶來的問題

etag通常使用元件的某些屬性來構造它,這些屬性對於特定的寄宿了**伺服器來說是唯一的。當瀏覽器從一台伺服器上獲取了原始元件,之後又向另外一台不同的伺服器發起條件get請求時,etag是不會匹配的。

http響應優化

目前的web伺服器絕大多數都採用http/1.1標準,所以

移除etag和expires,使用cache-control控制本地快取

post請求不能快取。

瀏覽器的快取控制

瀏覽器在請求已經訪問過的url時,會判斷是否使用快取,而瀏覽器的快取控制分為強快取和協商快取 協商快取必須配合強快取使用。瀏覽器的第一次快取 首先瀏覽器第一次跟伺服器請求乙個資源,伺服器在返回這個資源和response header的同時,會根據開發者要求或者瀏覽器預設,在response的head...

快取 瀏覽器快取

瀏覽器快取 brower caching 是瀏覽器在本地磁碟對使用者最近請求過的文件進行儲存,當訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁碟載入文件 1 瀏覽器第一次請求時,會發出一組 http 頭,用來指導瀏覽器如何進行快取。伺服器規定乙個資源是否要進行快取,主要由響應頭中的expires...

瀏覽器快取

1.為什麼使用瀏覽器快取 以前了解的動態指令碼加速,或者動態內容快取之類,他們的原理都是避免伺服器重複計算,結果仍保留在伺服器端,這樣獲取資料還得從伺服器檢索然後傳送到使用者瀏覽器,如果我們把這些結果放在瀏覽器中,就省去了伺服器的查詢和網路傳輸,瀏覽器快取很好的實現了這個功能 2.瀏覽器快取存放在哪...