強緩存
Pragma 是 HTTP1.0 時期的產(chǎn)物,和后面要說的 cache-control 作用差不多筝闹,它的值只能設(shè)置為
no-cache
媳叨。與 Cache-Control: no-cache 效果一致,即禁用強緩存丁存,只能使用協(xié)商緩存肩杈。Expires 是HTTP/1.0控制網(wǎng)頁緩存的字段,其值為服務(wù)器返回該請求結(jié)果緩存的到期時間解寝,即再次發(fā)起該請求時扩然,如果客戶端的時間小于Expires的值時,直接使用緩存結(jié)果
Cache-Control 是HTTP 1.1 中增加的字段,被設(shè)計用來替代 pragma。cache-control 這個頭部字段既可以用在請求頭也可以用在響應(yīng)頭中厕宗。(
推薦
)
優(yōu)先級
pragma > Cache-Control > Expires
協(xié)商緩存
方法一
- 服務(wù)器響應(yīng)請求時,返回該資源文件在服務(wù)器最后被修改的時間
Last-Modified - 客戶端再次發(fā)起該請求時兵拢,攜帶上次請求返回的Last-Modified值
Last-Modified-Since
服務(wù)器的資源最后被修改時間大于If-Modified-Since的字段值,則重新返回資源逾礁,狀態(tài)碼為200说铃;否則則返回304,代表資源無更新嘹履,可繼續(xù)使用緩存文件
方法二
- 服務(wù)器響應(yīng)請求時腻扇,返回當(dāng)前資源文件的一個唯一標識(由服務(wù)器生成)
Etag - 客戶端再次發(fā)起該請求時,攜帶上次請求返回的唯一標識Etag值砾嫉,通過此字段值告訴服務(wù)器該資源上次請求返回的唯一標識值幼苛。
If-None-Match
服務(wù)器收到該請求后,發(fā)現(xiàn)該請求頭中含有If-None-Match焕刮,則會根據(jù)If-None-Match的字段值與該資源在服務(wù)器的Etag值做對比舶沿,一致則返回304墙杯,代表資源無更新,繼續(xù)使用緩存文件括荡;不一致則重新返回資源文件高镐,狀態(tài)碼為200
優(yōu)先級
Etag / If-None-Match > Last-Modified / If-Modified-Since
為什么有了 last-modified 還需要 etag ?
資源在 1 秒內(nèi)更新一汽,并且在該一秒內(nèi)訪問避消,使用 last-modified 處理協(xié)商緩存無法獲取最新資源低滩。本質(zhì)上的原因還是因為 last-modified 是精確到秒的召夹,無法反映在 1 秒內(nèi)的變化。
當(dāng)資源多次被修改后內(nèi)容不變恕沫,使用 last-modified 來處理有點浪費监憎。多次修改資源,其 last-modified 值肯定是會變的婶溯,但是如果內(nèi)容不變我們其實不需要服務(wù)器返回最新資源鲸阔,直接使用本地緩存。使用 etag 就沒這個問題迄委,因為同一個資源多次修改褐筛,內(nèi)容一樣, hash 值也一樣叙身。
使用 etag 更加靈活渔扎,因為 etag 并不一定是 hash 值,etag 采用的是弱比較算法信轿,即兩個文件除了每個比特都相同外晃痴,內(nèi)容一致也可以認為是相同的。例如财忽,如果兩個頁面僅僅在頁腳的生成時間有所不同倘核,就可以認為二者是相同的。