目的:加快資源獲取,提升用戶體驗塞栅,減少網(wǎng)絡(luò)傳輸者铜,緩解服務(wù)端的壓力。
1放椰、強緩存:不需要發(fā)送請求到服務(wù)端作烟,直接讀取瀏覽器本地緩存。注意:在Chrome中砾医,存儲位置分為Disk cache和Memory cache(內(nèi)存)拿撩,存放的位置由瀏覽器決定。由Expires藻烤、Cache-Control绷雏、Pragma 3個Header屬性共同控制。
- a)Expires:優(yōu)先級最低怖亭、存的是系統(tǒng)時間涎显,如果系統(tǒng)時間和服務(wù)器時間不一致的情況,會出現(xiàn)緩存有效期不準的情況兴猩;
- b)Cache-Control:http/1.1中增加的屬性期吓,在請求頭和響應(yīng)頭中都可以使用;取值有:
? i.max-age:單位是秒
? ii.no-cache:不使用強緩存
? iii.no-store:禁止使用緩存倾芝,協(xié)商緩存也不讓用讨勤;
? iv.private:專用于個人的緩存,中間代理晨另、cdn不能緩存此響應(yīng)
? v.public:響應(yīng)可以被中間代理潭千、cdn等緩存 - c)Pragma:只有一個值:no-store,優(yōu)先級最高借尿,不使用強緩存刨晴;
2屉来、協(xié)商緩存:強緩存失效的時候或者請求頭中設(shè)置了不走強緩存,并且在請求頭中設(shè)置了If-Modified-Since或者If-None-Match的時候狈癞,會去服務(wù)器驗證協(xié)商緩存茄靠,如果命中了協(xié)商緩存,會在響應(yīng)頭設(shè)置Last-Modified或者Etag屬性蝶桶。
- a)ETag/If-None-Mathc 是一串hash碼慨绳,代表的是資源的標識符,當(dāng)文件發(fā)生變化的時候真竖,hash碼會變化脐雪,反之不會變,以W/ 開頭的是弱校驗疼邀,知否服務(wù)器上的文件差異能觸發(fā)hash值變化的時候喂江,才會真正請求資源,否則返回304并加載瀏覽器緩存旁振。
- b)Last-Modified/If-Modified-Since:第一次請求的時候服務(wù)器將資源最后修改時間放在Last-Modified字段中響應(yīng)获询,然后再次請求的時候?qū)ast-Modified的值放在If-Modified-Since字段中發(fā)送到服務(wù)器,服務(wù)器根據(jù)這兩個時間做對比拐袜,如果相等吉嚣,返回304,并加載瀏覽器緩存蹬铺。
比較:
1尝哆、ETag/If-None-Match主要解決了Last-Modified解決不了的問題:如果修改頻率在秒級以下,Last-Modified會返回錯誤的304甜攀,實際上應(yīng)該返回新修改的秋泄;
2、如果文件被修改了规阀,但是內(nèi)容沒有發(fā)生變化恒序,Last-Modified會錯誤的不返回304;