摘要:如果在中指定的值為,則瀏覽器會(huì)向服務(wù)器發(fā)起請(qǐng)求,等待服務(wù)器的響應(yīng),如果服務(wù)器判定資源沒有被修改,則會(huì)返回狀態(tài)碼,告知瀏覽器直接取緩存中的數(shù)據(jù),如果資源發(fā)生了改變,則服務(wù)器會(huì)返回新的資源,并返回狀態(tài)碼。
瀏覽器緩存機(jī)制 Expires策略
Expires是web服務(wù)器響應(yīng)消息頭字段,在響應(yīng)http請(qǐng)求時(shí)告訴瀏覽器在過期時(shí)間前瀏覽器可以直接從瀏覽器緩存讀取數(shù)據(jù),而無需再次請(qǐng)求。
Web服務(wù)器告訴瀏覽器在GMT(格林尼治時(shí)間):Tue,27 Jun 2017 02:15:13之前,可以使用緩存文件。
Expires是HTTP 1.0定義的內(nèi)容,現(xiàn)在大多數(shù)瀏覽器默認(rèn)使用HTTP 1.1,所以它的作用較小。
Cache-Control 1. 緩存控制頭 Cache-ControlCache-Control是HTTP中,控制緩存行為的首部字段。Cache-Control可以控制瀏覽器是否直接從瀏覽器緩存存取數(shù)據(jù)還是重新發(fā)送請(qǐng)求到服務(wù)器獲取數(shù)據(jù)。Cache-Control的選擇項(xiàng)更多,設(shè)置更細(xì)致,如果同時(shí)設(shè)置的話,其優(yōu)先級(jí)高于Expires
2. request header中的Cache-Controlrequest header中cache-control的可選值有一下幾種:no-cahce,no-store,max-age,max-stale,min-fresh,only-if-cached
在瀏覽器中,發(fā)起請(qǐng)求主要有兩種方式:
打開一個(gè)鏈接,瀏覽器自動(dòng)會(huì)發(fā)起一個(gè)請(qǐng)求,這個(gè)過程中,沒有辦法指定request header中的cache-control,請(qǐng)求中的cache-control是由瀏覽器指定的,不同的瀏覽器的cache-control的值會(huì)有不同,通常情況下cache-control的值為max-age=0
在JavaScript中,我們可以通過Ajax來發(fā)起請(qǐng)求,并通過xhr.setRequestHeader("cache-control", "xxx")的方式來指定請(qǐng)求的cache-control的值。
cache-control的值有很多,那么不同的值會(huì)如何影響瀏覽器對(duì)請(qǐng)求的處理呢?經(jīng)過我的測試(使用Chrome、Opera瀏覽器),在大多數(shù)情況下(request header中的cache-control的值為:no-store,max-age,max-stale,min-fresh,only-if-cached,對(duì)響應(yīng)內(nèi)容設(shè)置了max-age),如果請(qǐng)求的資源沒有過期,則瀏覽器不會(huì)向服務(wù)器發(fā)起請(qǐng)求,而是直接從瀏覽器緩存中獲取資源;如果請(qǐng)求的資源過期了,則瀏覽器會(huì)向服務(wù)器發(fā)起請(qǐng)求,等待服務(wù)器的響應(yīng),如果服務(wù)器判定資源沒有被修改,則會(huì)返回304狀態(tài)碼,告知瀏覽器直接取緩存中的數(shù)據(jù);如果資源發(fā)生了改變,則服務(wù)器會(huì)返回新的資源,并返回200狀態(tài)碼(服務(wù)器是通過if-Modified-Since和if-None-Match來判斷資源是否被修改的 )。
但是,存在兩種例外情況:
如果在request header中指定cache-control的值為no-cache,則瀏覽器會(huì)向服務(wù)器發(fā)起請(qǐng)求,向服務(wù)器重新請(qǐng)求資源,無論本地資源有沒有過期、該資源有沒有改變,服務(wù)器也會(huì)重新傳送一次資源。
如果在request header中指定cache-control的值為mag-age=0,則瀏覽器會(huì)向服務(wù)器發(fā)起請(qǐng)求,等待服務(wù)器的響應(yīng),如果服務(wù)器判定資源沒有被修改,則會(huì)返回304狀態(tài)碼,告知瀏覽器直接取緩存中的數(shù)據(jù),如果資源發(fā)生了改變,則服務(wù)器會(huì)返回新的資源,并返回200狀態(tài)碼。
3. response header中的Cache-Controlresponse header中的cache-control指明了瀏覽器對(duì)響應(yīng)內(nèi)容的緩存方式
緩存響應(yīng)指令 | 說明 |
---|---|
no-cache | 不緩存過期的資源,在提供緩存資源前必須先向服務(wù)器確認(rèn)有效性 |
no-store | 不緩存響應(yīng)的任何內(nèi)容 |
max-age | 響應(yīng)的最大Age值 |
public | 表明響應(yīng)可以被任何對(duì)象(包括:發(fā)送請(qǐng)求的客戶端,代理服務(wù)器,等等)緩存 |
private | 表明響應(yīng)只能被單個(gè)用戶緩存,不能作為共享緩存(即代理服務(wù)器不能緩存它) |
must-revalidate | 緩存必須在使用之前驗(yàn)證舊資源的狀態(tài),并且不可使用過期資源。 |
no-transform | 代理不可更改媒體類型 |
proxy-revalidate | 要求中間緩存服務(wù)器對(duì)緩存的響應(yīng)有效性再進(jìn)行確認(rèn) |
s-maxage | 公共緩存服務(wù)器響應(yīng)的最大Age值,針對(duì)緩存服務(wù)器 |
瀏覽器接受來自服務(wù)器的響應(yīng),會(huì)根據(jù)response header中的cache-control來決定對(duì)響應(yīng)內(nèi)容進(jìn)行怎樣的處理,下面詳細(xì)說明一些常用的cache-control指令
no-cache:no-cache代表的不是不緩存,它的意思是不緩存過期的資源。一個(gè)資源的cache-control值為no-cache,當(dāng)再次請(qǐng)求該資源時(shí),瀏覽器會(huì)向服務(wù)器發(fā)送請(qǐng)求,確認(rèn)該資源是否被修改過,如果沒有被修改過,服務(wù)器返回響應(yīng)狀態(tài)碼304,瀏覽器從緩存中取得資源;如果服務(wù)器中的資源發(fā)生了修改,服務(wù)器會(huì)返回新的資源,并返回響應(yīng)狀態(tài)碼200,瀏覽器從響應(yīng)體中取得資源
no-store:no-store代表的才是不緩存,如果響應(yīng)的cache-control的值為no-store,則瀏覽器不會(huì)緩存該響應(yīng)體,當(dāng)再次請(qǐng)求該資源的時(shí)候,瀏覽器會(huì)發(fā)送請(qǐng)求,從服務(wù)器獲取資源。
max-age: 當(dāng)服務(wù)器返回的響應(yīng)的cache-control的值為max-age=xxx時(shí),在max-age指定的時(shí)間范圍之內(nèi),瀏覽器將不對(duì)資源的有效性(服務(wù)器中的資源是否發(fā)生改變)再作確認(rèn),即當(dāng)再次請(qǐng)求該資源時(shí),瀏覽器直接從緩存中取得該資源,此時(shí)不會(huì)向服務(wù)器發(fā)送請(qǐng)求,但是也會(huì)有響應(yīng)狀態(tài)碼(200 OK from disk cache);當(dāng)超出max-age指定的時(shí)間范圍,瀏覽器會(huì)向服務(wù)器發(fā)送請(qǐng)求,確認(rèn)服務(wù)器中的資源與緩存中的資源是否一致,如果一致,則會(huì)返回響應(yīng)狀態(tài)碼304(Not Modified),瀏覽器直接從緩存中取得資源,如果服務(wù)器端的資源發(fā)生了變動(dòng),則服務(wù)器會(huì)返回新的資源和響應(yīng)狀態(tài)碼200,瀏覽器從響應(yīng)體中獲取資源。
Last-Modified與if-Modified-SinceLast-Modified表示服務(wù)器端文件的最后修改時(shí)間,需要和cache-control共同使用,是檢查服務(wù)器端資源是否更新的一種方式。當(dāng)瀏覽器再次進(jìn)行請(qǐng)求時(shí),會(huì)向服務(wù)器傳送If-Modified-Since報(bào)頭,詢問Last-Modified時(shí)間點(diǎn)之后資源是否被修改過。如果沒有修改,則響應(yīng)狀態(tài)碼碼為為304,使用緩存;如果修改過,則再次去服務(wù)器請(qǐng)求資源,響應(yīng)狀態(tài)碼碼為200,資源為服務(wù)器最新資源。
Etag與if-None-MatchETage是服務(wù)器根據(jù)實(shí)體內(nèi)容生成一段hash字符串,能夠標(biāo)識(shí)資源的狀態(tài),能夠更加準(zhǔn)確的控制緩存。當(dāng)瀏覽器再次請(qǐng)求時(shí),會(huì)向服務(wù)器傳送if-None-Match報(bào)頭,服務(wù)器會(huì)比較資源的ETage值與if-None-Math的值,來判斷資源是否已經(jīng)修改,如果沒有修改,則響應(yīng)狀態(tài)碼碼為304,使用緩存;如果修改過,則返回最新資源,響應(yīng)狀態(tài)碼為200,資源為服務(wù)器最新資源。
Last-Modified與ETag比較Last-modified與ETag是可以一起使用的,服務(wù)器會(huì)優(yōu)先驗(yàn)證ETag,一致的情況下,才會(huì)繼續(xù)對(duì)比Last-modified。最后才決定是否返回304.
使用ETag可以解決Last-modified存在的一些問題:
1. 某些服務(wù)器不能精確得到資源的最后修改時(shí)間,這樣就無法通過最后修改時(shí)間判斷資源是否更新 2. 如果資源修改非常頻繁,在秒以下的時(shí)間內(nèi)進(jìn)行修改,而Last-modified只能精確到秒 3. 一些資源的最后修改時(shí)間改變了,但是內(nèi)容沒改變,使用ETag就認(rèn)為資源還是沒有修改的。使用緩存流程 強(qiáng)緩存與協(xié)商緩存
強(qiáng)緩存:不發(fā)送請(qǐng)求到服務(wù)器確認(rèn)資源是否有效,直接從緩存中取得資源
協(xié)商緩存:從緩存中取資源前,先向服務(wù)器發(fā)送請(qǐng)求,確認(rèn)資源是否有效(過期),如果資源有效(資源沒有改動(dòng)),則服務(wù)器返回響應(yīng)狀態(tài)碼304,告知瀏覽器本地緩存可以繼續(xù)使用;如果資源失效(資源發(fā)生了改動(dòng)),則服務(wù)器返回新的資源和響應(yīng)狀態(tài)碼200,此時(shí)不使用本地失效的資源。
用戶行為對(duì)緩存的影響盜用網(wǎng)上的一張圖,來說明用戶行為對(duì)緩存的影響
經(jīng)過測試,對(duì)F5刷新會(huì)導(dǎo)致Expires/Cache-Control無效的說法持保留意見
參考資料淺談Web緩存
Web瀏覽器的緩存機(jī)制
MDN: Cache-Control
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83691.html
摘要:如果在中指定的值為,則瀏覽器會(huì)向服務(wù)器發(fā)起請(qǐng)求,等待服務(wù)器的響應(yīng),如果服務(wù)器判定資源沒有被修改,則會(huì)返回狀態(tài)碼,告知瀏覽器直接取緩存中的數(shù)據(jù),如果資源發(fā)生了改變,則服務(wù)器會(huì)返回新的資源,并返回狀態(tài)碼。 瀏覽器緩存機(jī)制 Expires策略 Expires是web服務(wù)器響應(yīng)消息頭字段,在響應(yīng)http請(qǐng)求時(shí)告訴瀏覽器在過期時(shí)間前瀏覽器可以直接從瀏覽器緩存讀取數(shù)據(jù),而無需再次請(qǐng)求。 showI...
摘要:根據(jù)標(biāo)準(zhǔn),到目前為止,一共有種緩存機(jī)制,有些是之前已有,有些是才新加入的。首次請(qǐng)求緩存有效期內(nèi)請(qǐng)求緩存過期后請(qǐng)求一般瀏覽器會(huì)將緩存記錄及緩存文件存在本地文件夾中。 騰訊 Bugly 特約作者:賀輝超 1. H5 緩存機(jī)制介紹 H5,即 HTML5,是新一代的 HTML 標(biāo)準(zhǔn),加入很多新的特性。離線存儲(chǔ)(也可稱為緩存機(jī)制)是其中一個(gè)非常重要的特性。H5 引入的離線存儲(chǔ),這意味著 web ...
摘要:對(duì)于瀏覽器緩存,相信很多開發(fā)者對(duì)它真的是又愛又恨。那么瀏覽器緩存究竟是個(gè)什么樣的神奇玩意呢什么是瀏覽器緩存簡單來說,瀏覽器緩存就是把一個(gè)已經(jīng)請(qǐng)求過的資源如頁面,圖片,,數(shù)據(jù)等拷貝一份副本儲(chǔ)存在瀏覽器中。 對(duì)于瀏覽器緩存,相信很多開發(fā)者對(duì)它真的是又愛又恨。一方面極大地提升了用戶體驗(yàn),而另一方面有時(shí)會(huì)因?yàn)樽x取了緩存而展示了錯(cuò)誤的東西,而在開發(fā)過程中千方百計(jì)地想把緩存禁掉。那么瀏覽器緩存究竟...
摘要:對(duì)于瀏覽器緩存,相信很多開發(fā)者對(duì)它真的是又愛又恨。那么瀏覽器緩存究竟是個(gè)什么樣的神奇玩意呢什么是瀏覽器緩存簡單來說,瀏覽器緩存就是把一個(gè)已經(jīng)請(qǐng)求過的資源如頁面,圖片,,數(shù)據(jù)等拷貝一份副本儲(chǔ)存在瀏覽器中。 對(duì)于瀏覽器緩存,相信很多開發(fā)者對(duì)它真的是又愛又恨。一方面極大地提升了用戶體驗(yàn),而另一方面有時(shí)會(huì)因?yàn)樽x取了緩存而展示了錯(cuò)誤的東西,而在開發(fā)過程中千方百計(jì)地想把緩存禁掉。那么瀏覽器緩存究竟...
閱讀 2362·2021-11-23 09:51
閱讀 2016·2021-10-14 09:43
閱讀 2786·2021-09-27 13:35
閱讀 1164·2021-09-22 15:54
閱讀 2520·2021-09-13 10:36
閱讀 3829·2019-08-30 15:56
閱讀 3419·2019-08-30 14:09
閱讀 1727·2019-08-30 12:57