HTTP頭信息控制緩存
http1.0 時代緩存字段詳解
一:Pragma
Pragma:設(shè)置頁面是否緩存蔽莱,為Pragma則緩存砌溺,no-cache則不緩存
當(dāng)該字段值為no-cache的時候,會知會客戶端不要對該資源讀緩存碴裙,即每次都得向服務(wù)器發(fā)一次請求才行逝段。
二:Expires
有了Pragma來禁用緩存私股,自然也需要有個東西來啟用緩存和定義緩存時間刷允,對http1.0而言,Expires就是做這件事的首部字段碧囊。 Expires的值對應(yīng)一個GMT(格林尼治時間)树灶,比如Mon, 22 Jul 2002 11:12:01 GMT來告訴瀏覽器資源緩存過期時間,如果還沒過該時間點則不發(fā)請求糯而。
如果Pragma頭部和Expires頭部同時存在天通,則起作用的會是Pragma,需要注意的是熄驼,響應(yīng)報文中Expires所定義的緩存時間是相對服務(wù)器上的時間而言的像寒,其定義的是資源“失效時刻”,如果客戶端上的時間跟服務(wù)器上的時間不一致(特別是用戶修改了自己電腦的系統(tǒng)時間)瓜贾,那緩存時間可能就沒啥意義了诺祸。,那緩存時間可能就沒啥意義了祭芦。
http1.1 時代緩存字段詳解
cache-control
由于Expires是先對服務(wù)器無法保證筷笨,無法保證和客戶端時間統(tǒng)一,http1.1新增了 Cache-Control 來定義緩存過期時間。
注意:若報文同時出現(xiàn)了 Expires 和 Cache-Control胃夏,則以 Cache-Control 為準(zhǔn)轴或。
優(yōu)先級:Pragma->cache-control->expires
注意:Cache-Control: no-cache:這個很容易讓人產(chǎn)生誤解,使人誤以為是響應(yīng)不被緩存仰禀。實際上Cache-Control: no-cache是會被緩存的 - 這個會告知代理服務(wù)器不直接緩存照雁,而向原服務(wù)器請求緩存。
Cache-Control: no-store:這個才是響應(yīng)不被緩存的意思答恶。
Last-Modified/If-Modified-Since
Last-Modified/If-Modified-Since要配合Cache-Control使用饺蚊。
- Last-Modified:這個相應(yīng)的最后修改時間。
- If-Modified-Since: 當(dāng)資源過期時(使用Cache-Control標(biāo)識的max-age)亥宿,發(fā)現(xiàn)資源具有Last-Modified聲明卸勺,則再次向web服務(wù)器請求時帶上頭 If-Modified-Since,表示請求時間烫扼。web服務(wù)器收到請求后發(fā)現(xiàn)有頭If-Modified-Since 則與被請求資源的最后修改時間進(jìn)行比對曙求。若最后修改時間較新,說明資源又被改動過映企,則響應(yīng)整片資源內(nèi)容(寫在響應(yīng)消息包體內(nèi))悟狱,HTTP 200;若最后修改時間較舊堰氓,說明資源無新修改挤渐,則響應(yīng)HTTP 304 (無需包體,節(jié)省瀏覽)双絮,告知瀏覽器繼續(xù)使用所保存的cache浴麻。
Etag/If-None-Match
Etag/If-None-Match要配合Cache-Control使用。
- Etag web服務(wù)器響應(yīng)請求時囤攀,告訴瀏覽器當(dāng)前資源在服務(wù)器的唯一標(biāo)識
- If-None-Match:當(dāng)資源過期時(使用Cache-Control標(biāo)識的max-age)软免,發(fā)現(xiàn)資源具有Etage聲明,則再次向web服務(wù)器請求時帶上頭If-None-Match (Etag的值)焚挠。web服務(wù)器收到請求后發(fā)現(xiàn)有頭If-None-Match 則與被請求資源的相應(yīng)校驗串進(jìn)行比對膏萧,決定返回200或304。
既生Last-Modified何生Etag
HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個Last-Modified比較難解決的問題
- Last-Modified標(biāo)注的最后修改只能精確到秒級蝌衔,如果某些文件在1秒鐘以內(nèi)榛泛,被修改多次的話,它將不能準(zhǔn)確標(biāo)注文件的修改時間
- 如果某些文件會被定期生成噩斟,當(dāng)有時內(nèi)容并沒有任何變化曹锨,但Last-Modified卻改變了,導(dǎo)致文件沒法使用緩存
- 有可能存在服務(wù)器沒有準(zhǔn)確獲取文件修改時間剃允,或者與代理服務(wù)器時間不一致等情形
Etag是服務(wù)器自動生成或者由開發(fā)者生成的對應(yīng)資源在服務(wù)器端的唯一標(biāo)識符艘希,能夠更加準(zhǔn)確的控制緩存硼身。Last-Modified與ETag是可以一起使用的,服務(wù)器會優(yōu)先驗證ETag覆享,一致的情況下佳遂,才會繼續(xù)比對Last-Modified,最后才決定是否返回304撒顿。
總結(jié):瀏覽器緩存策略分為:強(qiáng)緩存丑罪、協(xié)商緩存
一:強(qiáng)緩存
實現(xiàn)強(qiáng)緩存可以通過兩種響應(yīng)頭實現(xiàn):Expires 和 Cache-Control 。強(qiáng)緩存表示在緩存期間不需要請求凤壁,state code 為 200
二:協(xié)商緩存
如果緩存過期了吩屹,我們就可以使用協(xié)商緩存來解決問題。協(xié)商緩存需要請求拧抖,如果緩存有效會返回 304煤搜。
協(xié)商緩存需要客戶端和服務(wù)端共同實現(xiàn),和強(qiáng)緩存一樣唧席,也有兩種實現(xiàn)方式擦盾。
Last-Modified 和 If-Modified-Since
Last-Modified 表示本地文件最后修改日期,If-Modified-Since 會將 Last-Modified 的值發(fā)送給服務(wù)器淌哟,詢問服務(wù)器在該日期后資源是否有更新迹卢,有更新的話就會將新的資源發(fā)送回來。
但是如果在本地打開緩存文件徒仓,就會造成 Last-Modified 被修改腐碱,所以在 HTTP / 1.1 出現(xiàn)了 ETag 。
ETag 和 If-None-Match
ETag 類似于文件指紋掉弛,If-None-Match 會將當(dāng)前 ETag 發(fā)送給服務(wù)器症见,詢問該資源 ETag 是否變動,有變動的話就將新的資源發(fā)送回來殃饿。并且 ETag 優(yōu)先級比 Last-Modified 高谋作。
參考:為什么要使用web緩存?