1从藤、瀏覽器緩存
緩存這東西劳坑,第一次必須獲取到資源后链韭,然后根據(jù)返回的信息來告訴如何緩存資源缎玫,可能采用的是強(qiáng)緩存,也可能告訴客戶端瀏覽器是協(xié)商緩存膳灶,這都需要根據(jù)響應(yīng)的header內(nèi)容來決定的咱士。下面用兩幅圖來描述瀏覽器的緩存是怎么玩的,讓大家有個(gè)大概的認(rèn)知轧钓。
瀏覽器第一次請(qǐng)求時(shí):
瀏覽器后續(xù)在進(jìn)行請(qǐng)求時(shí):
從上圖可以知道序厉,瀏覽器緩存包含兩種類型,即強(qiáng)緩存(也叫本地緩存)和協(xié)商緩存毕箍,瀏覽器在第一次請(qǐng)求發(fā)生后弛房,再次請(qǐng)求時(shí):
如果沒有命中強(qiáng)緩存涩澡,瀏覽器會(huì)發(fā)送請(qǐng)求到服務(wù)器顽耳,請(qǐng)求會(huì)攜帶第一次請(qǐng)求返回的有關(guān)緩存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服務(wù)器根據(jù)請(qǐng)求中的相關(guān)header信息來比對(duì)結(jié)果是否協(xié)商緩存命中筏养;若命中斧抱,則服務(wù)器返回新的響應(yīng)header信息更新緩存中的對(duì)應(yīng)header信息,但是并不返回資源內(nèi)容渐溶,它會(huì)告知瀏覽器可以直接從緩存獲然云帧;否則返回最新的資源內(nèi)容
強(qiáng)緩存與協(xié)商緩存的區(qū)別:
強(qiáng)緩存 從緩存取 200(from cache)否茎辐,直接從緩存取
協(xié)商緩存 從緩存取 304(not modified)是宪郊,正如其名掂恕,通過服務(wù)器來告知緩存是否可用
2、?強(qiáng)緩存相關(guān)的header字段
強(qiáng)緩存上面已經(jīng)介紹了弛槐,直接從緩存中獲取資源而不經(jīng)過服務(wù)器懊亡;與強(qiáng)緩存相關(guān)的header字段有兩個(gè):
expires,這是http1.0時(shí)的規(guī)范乎串;它的值為一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串店枣,如Mon, 10 Jun 2015 21:31:12 GMT,如果發(fā)送請(qǐng)求的時(shí)間在expires之前叹誉,那么本地緩存始終有效鸯两,否則就會(huì)發(fā)送請(qǐng)求到服務(wù)器來獲取資源
cache-control:max-age=number,這是http1.1時(shí)出現(xiàn)的header信息长豁,主要是利用該字段的max-age值來進(jìn)行判斷钧唐,它是一個(gè)相對(duì)值;資源第一次的請(qǐng)求時(shí)間和Cache-Control設(shè)定的有效期匠襟,計(jì)算出一個(gè)資源過期時(shí)間钝侠,再拿這個(gè)過期時(shí)間跟當(dāng)前的請(qǐng)求時(shí)間比較,如果請(qǐng)求時(shí)間在過期時(shí)間之前酸舍,就能命中緩存帅韧,否則就不行;cache-control除了該字段外父腕,還有下面幾個(gè)比較常用的設(shè)置值:no-cache:不使用本地緩存弱匪。需要使用緩存協(xié)商青瀑,先與服務(wù)器確認(rèn)返回的響應(yīng)是否被更改璧亮,如果之前的響應(yīng)中存在ETag,那么請(qǐng)求的時(shí)候會(huì)與服務(wù)端驗(yàn)證斥难,如果資源未被更改枝嘶,則可以避免重新下載。
no-store:直接禁止游覽器緩存數(shù)據(jù)哑诊,每次用戶請(qǐng)求該資源群扶,都會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,每次都會(huì)下載完整的資源镀裤。
public:可以被所有的用戶緩存竞阐,包括終端用戶和CDN等中間代理服務(wù)器。
private:只能被終端用戶的瀏覽器緩存暑劝,不允許CDN等中繼緩存服務(wù)器對(duì)其緩存骆莹。
注意:如果cache-control與expires同時(shí)存在的話,cache-control的優(yōu)先級(jí)高于expires
3担猛、?協(xié)商緩存相關(guān)的header字段
協(xié)商緩存都是由服務(wù)器來確定緩存資源是否可用的幕垦,所以客戶端與服務(wù)器端要通過某種標(biāo)識(shí)來進(jìn)行通信丢氢,從而讓服務(wù)器判斷請(qǐng)求資源是否可以緩存訪問,這主要涉及到下面兩組header字段先改,這兩組搭檔都是成對(duì)出現(xiàn)的疚察,即第一次請(qǐng)求的響應(yīng)頭帶上某個(gè)字段(Last-Modified或者Etag),則后續(xù)請(qǐng)求則會(huì)帶上對(duì)應(yīng)的請(qǐng)求字段(If-Modified-Since或者If-None-Match)仇奶,若響應(yīng)頭沒有Last-Modified或者Etag字段貌嫡,則請(qǐng)求頭也不會(huì)有對(duì)應(yīng)的字段。
Last-Modified/If-Modified-Since二者的值都是GMT格式的時(shí)間字符串该溯,具體過程:瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源衅枫,服務(wù)器在返回這個(gè)資源的同時(shí),在respone的header加上Last-Modified的header朗伶,這個(gè)header表示這個(gè)資源在服務(wù)器上的最后修改時(shí)間
瀏覽器再次跟服務(wù)器請(qǐng)求這個(gè)資源時(shí)弦撩,在request的header上加上If-Modified-Since的header,這個(gè)header的值就是上一次請(qǐng)求時(shí)返回的Last-Modified的值
服務(wù)器再次收到資源請(qǐng)求時(shí)论皆,根據(jù)瀏覽器傳過來If-Modified-Since和資源在服務(wù)器上的最后修改時(shí)間判斷資源是否有變化益楼,如果沒有變化則返回304 Not Modified,但是不會(huì)返回資源內(nèi)容点晴;如果有變化感凤,就正常返回資源內(nèi)容。當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí)粒督,response header中不會(huì)再添加Last-Modified的header陪竿,因?yàn)榧热毁Y源沒有變化,那么Last-Modified也就不會(huì)改變屠橄,這是服務(wù)器返回304時(shí)的response header
瀏覽器收到304的響應(yīng)后族跛,就會(huì)從緩存中加載資源
如果協(xié)商緩存沒有命中,瀏覽器直接從服務(wù)器加載資源時(shí)锐墙,Last-Modified的Header在重新加載的時(shí)候會(huì)被更新礁哄,下次請(qǐng)求時(shí),If-Modified-Since會(huì)啟用上次返回的Last-Modified值
Etag/If-None-Match這兩個(gè)值是由服務(wù)器生成的每個(gè)資源的唯一標(biāo)識(shí)字符串溪北,只要資源有變化就這個(gè)值就會(huì)改變桐绒;其判斷過程與Last-Modified/If-Modified-Since類似,與Last-Modified不一樣的是之拨,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí)茉继,由于ETag重新生成過,response header中還會(huì)把這個(gè)ETag返回蚀乔,即使這個(gè)ETag跟之前的沒有變化烁竭。
4、既生Last-Modified何生Etag
你可能會(huì)覺得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新乙墙,為什么還需要Etag呢颖变?HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個(gè)Last-Modified比較難解決的問題:
一些文件也許會(huì)周期性的更改生均,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了腥刹,而重新GET马胧;
某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改衔峰,(比方說1s內(nèi)修改了N次)佩脊,If-Modified-Since能檢查到的粒度是s級(jí)的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒)垫卤;
某些服務(wù)器不能精確的得到文件的最后修改時(shí)間威彰。
這時(shí),利用Etag能夠更加準(zhǔn)確的控制緩存穴肘,因?yàn)镋tag是服務(wù)器自動(dòng)生成或者由開發(fā)者生成的對(duì)應(yīng)資源在服務(wù)器端的唯一標(biāo)識(shí)符歇盼。
Last-Modified****與ETag****是可以一起使用的,服務(wù)器會(huì)優(yōu)先驗(yàn)證ETag****评抚,一致的情況下豹缀,才會(huì)繼續(xù)比對(duì)Last-Modified****,最后才決定是否返回304慨代。
5邢笙、用戶的行為對(duì)緩存的影響