瀏覽器緩存機(jī)制:瀏覽器緩存機(jī)制,其實(shí)主要就是http協(xié)議定義的緩存機(jī)制(如:Expires;Cache-control等)扒俯。也有非http協(xié)議定義的緩存機(jī)制防症,如html meta標(biāo)簽:<meta http-equiv="Pragma" content="no-cache">,作用是告訴瀏覽器當(dāng)前頁(yè)面不被緩存,每次訪問(wèn)都需要去服務(wù)器拉取捞蛋。
注意:瀏覽器會(huì)在第一次請(qǐng)求完服務(wù)器后得到響應(yīng)吠撮,我們可以在服務(wù)器中設(shè)置這些響應(yīng)尊惰,從而達(dá)到在以后的請(qǐng)求中盡量減少甚至不從服務(wù)器端獲取資源的目的。瀏覽器是依靠請(qǐng)求和響應(yīng)中的頭信息來(lái)控制緩存的泥兰。
讀取緩存的流程:有兩步弄屡,首先根據(jù)約定時(shí)間,約定時(shí)間過(guò)來(lái)再來(lái)判斷下面兩種方式逾条。
Expires與Cache-Control:就是服務(wù)器端用來(lái)約定和客戶端的有效時(shí)間琢岩。
Expires規(guī)定了緩存失效(Date為當(dāng)前時(shí)間),而Cache-Control的max-age規(guī)定了緩存有效時(shí)間(2552s)师脂。Expires是http1.0的東西担孔,而Cache-Control是http1.1的,規(guī)定如果max-age和Expires同時(shí)存在吃警,前者優(yōu)先級(jí)高于后者糕篇。Cache-Control的參數(shù)可以設(shè)置如下值:
為了決定瀏覽器是讀取本地緩存還是去服務(wù)器拉取數(shù)據(jù),就需要判斷服務(wù)器上的文件是否有更新酌心,有以下兩種方式:
一:在上一次服務(wù)器端告訴客戶端約定的有效期的同時(shí)拌消,告訴客戶端該文件最后修改的時(shí)間,當(dāng)再次嘗試從服務(wù)器端下載該文件的時(shí)候安券,check下該文件有沒(méi)有更新(對(duì)比最后修改時(shí)間)墩崩,如果沒(méi)有,則讀取緩存侯勉。(last-Modified / if-Modified-Since 要配合Cache-Control使用)
last-Modified是響應(yīng)頭返回來(lái)的信息鹦筹,是服務(wù)器告訴瀏覽器被請(qǐng)求文件最后一次修改的時(shí)間;當(dāng)瀏覽器再次請(qǐng)求該文件的時(shí)候址貌,請(qǐng)求頭中包含了if-Modified-Since項(xiàng)铐拐,將這個(gè)日期和服務(wù)器端該文件最后一次修改日期對(duì)比徘键,如果相同,則相應(yīng)http304遍蟋,從緩存讀數(shù)據(jù)吹害;如果不相同,文件更新了,則相應(yīng)http200虚青,返回?cái)?shù)據(jù)它呀,同時(shí)通過(guò)響應(yīng)頭更新last-Modified的值。
二:在上一次服務(wù)器端告訴客戶端約定有效期的同時(shí)棒厘,同時(shí)告訴客戶端該文件的版本號(hào)钟些,當(dāng)服務(wù)器端文件更新的時(shí)候,改變版本號(hào)绊谭,再次發(fā)送請(qǐng)求的時(shí)候check一下版本號(hào)是否一致就行了,如一致汪拥,則直接讀取緩存达传。(ETag / if-None-Match 要配合Cache-Control使用 )
ETag并不是文件的版本號(hào),而是一串可以代表該文件唯一的字符串(Apache中迫筑,ETag的值宪赶,默認(rèn)是對(duì)文件的索引節(jié)點(diǎn),大小和最后修改時(shí)間進(jìn)行Hash后得到的脯燃。)搂妻,當(dāng)客戶端發(fā)現(xiàn)和服務(wù)器端約定的直接讀取緩存的時(shí)間過(guò)了,就在請(qǐng)求頭中發(fā)送if-None-Match選項(xiàng)辕棚,值為上次請(qǐng)求后響應(yīng)頭的ETag值欲主,該值在服務(wù)器端和服務(wù)端代表改文件唯一的字符串對(duì)比(如果服務(wù)器端該文件改變了,該值就會(huì)變)逝嚎,如果相同扁瓢,則相應(yīng)http304,客戶端直接讀取緩存补君,否則引几,http200,下載正確的數(shù)據(jù)挽铁,更新ETag值伟桅。
當(dāng)發(fā)送的請(qǐng)求頭中同時(shí)存在if-None-Match和if-Modified-Since時(shí),前者會(huì)優(yōu)先于后者叽掘,忽略后者楣铁。http1.1中ETag的出現(xiàn)主要是為了解決幾個(gè)Last-Modified比較難解決的問(wèn)題:
1.last-Modified標(biāo)注的最后修改只能精確到秒級(jí),如果某些文件在一秒鐘以內(nèi)够掠,被修改多次的話民褂,它將不能準(zhǔn)確標(biāo)注文件的修改時(shí)間。
2.如果某些文件會(huì)被定期生成,但有時(shí)內(nèi)容并沒(méi)有任何變化(僅僅改變了時(shí)間)赊堪,但last-Modified卻改變了面殖,導(dǎo)致文件沒(méi)法使用緩存。
3.有可能存在服務(wù)器沒(méi)有準(zhǔn)確獲取文件修改時(shí)間哭廉,或者與代理服務(wù)器時(shí)間不一致等情況脊僚。
無(wú)法被瀏覽器緩存的請(qǐng)求:
1.http信息頭中包含Cache-Control:no-cache,pragma:no-cache(http1.0),或cache-Control:max-age=0等告訴瀏覽器不用緩存的請(qǐng)求。
2.需要根據(jù)cookie遵绰,認(rèn)證信息等決定輸入內(nèi)容的動(dòng)態(tài)請(qǐng)求是不能被緩存的
3.經(jīng)過(guò)https安全加密的請(qǐng)求
4.Post請(qǐng)求無(wú)法被緩存辽幌。
5.http響應(yīng)頭中不包含last-Modified / Etag,也不包含Cache-Control / Expires的請(qǐng)求無(wú)法被緩存椿访。
用戶行為與緩存:
當(dāng)用戶在按F5進(jìn)行刷新的時(shí)候乌企,會(huì)忽略Expries/Cache-Control的設(shè)置,會(huì)再次發(fā)送請(qǐng)求去服務(wù)器請(qǐng)求成玫,而Last-Modified/Etag還是有效的加酵,服務(wù)器會(huì)根據(jù)情況判斷返回304還是200;而當(dāng)用戶使用ctrl+F5進(jìn)行強(qiáng)制刷新的時(shí)候哭当,只是所有的緩存機(jī)制都將失效猪腕,重新從服務(wù)器去拉取資源。