在我們使用瀏覽器訪問(wèn)網(wǎng)頁(yè)的過(guò)程中赶掖,瀏覽器經(jīng)常會(huì)緩存各種網(wǎng)頁(yè)中的內(nèi)容。當(dāng)再次訪問(wèn)同一個(gè)網(wǎng)頁(yè)時(shí),可以發(fā)現(xiàn)部分內(nèi)容是從緩存直接讀取的。
查看HTTP的響應(yīng)信息瑰钮,就能發(fā)現(xiàn)一些端倪着绊。比如響應(yīng) 200 from cache钞瀑; 304 not modify 等等熄守。
下面對(duì)瀏覽器使用緩存的各種情形做一下分析:
Pragma
Pragma是HTTP 1.0版本的一個(gè)參數(shù),在HTTP 1.1版本里面這個(gè)參數(shù)也會(huì)生效灌曙,如果不想瀏覽器緩存網(wǎng)頁(yè)的內(nèi)容黄鳍,可以在 Response header 里面加上 :Pragma: no-cache。
Cache-Control
Cache-Control是HTTP 1.1版本新增的一個(gè)參數(shù)平匈。
Cache-Control:no-store 不允許緩存
Cache-Control:no-cache 不允許直接使用緩存框沟,需要先發(fā)起請(qǐng)求和服務(wù)器協(xié)商(這個(gè)經(jīng)常被誤認(rèn)為是不允許緩存,實(shí)際上它的作用是讓瀏覽器在使用緩存前先請(qǐng)求服務(wù)端一次增炭,確認(rèn)內(nèi)容是否有更新)
Cache-control: max-age=86400 表示緩存86400秒 如果你在緩存期間再次訪問(wèn) 并且沒(méi)有設(shè)置 Cache-Control:no-cache , 就可以看到這個(gè)響應(yīng):這樣的響應(yīng)代表沒(méi)有跟服務(wù)端進(jìn)行交互忍燥,內(nèi)容是直接從本地讀取的。
Expires
Expires和Cache-control: max-age= 有類似的作用隙姿,都是指定緩存內(nèi)容的有效周期梅垄,Expires指定的格式是格林威治時(shí)間,max-age則是秒數(shù)输玷。
Last-Modified/If-Modified-Since
服務(wù)端也可以在 Response header 里加上 Last-Modified,它的格式是格林威治時(shí)間队丝,再次請(qǐng)求時(shí),瀏覽器的 Request header 中會(huì)多出一個(gè)叫 If-Modified-Since的值欲鹏,通過(guò)比較這兩個(gè)值是否一致來(lái)決定是否返回304机久。
ETag/If-None-Match
ETag的用法和 Last-Modified 類似,值是一種文件指紋赔嚎。比如:ETag:"5a3ccff0-5dc"膘盖。
服務(wù)端在 Response header 里加上 ETag胧弛,再次請(qǐng)求時(shí),瀏覽器的 Request header 中會(huì)多出一個(gè)叫 If-None-Match的值侠畔,通過(guò)比較這兩個(gè)值是否一致來(lái)決定是否返回304结缚。
總結(jié)
總體來(lái)說(shuō),瀏覽器使用緩存時(shí)有兩種表現(xiàn):
1.直接從本地讀取软棺,不與服務(wù)端有交互红竭,就是 200 OK (from memory cache)。
2.請(qǐng)求一次服務(wù)端喘落,查看本地緩存是否生效茵宪,這種方式叫 協(xié)商緩存。如果服務(wù)端判斷緩存有效揖盘,將不返回完整內(nèi)容眉厨,而是返回 304 Not Modified锌奴。
在優(yōu)先級(jí)上 Pragma > Cache-Control > Expires兽狭。