前言
本文是閱讀文章所做筆記。意在加深記憶也便于日后查找
強(qiáng)緩存和協(xié)商緩存
http的緩存機(jī)制可以分為兩種類型:
- 強(qiáng)緩存:瀏覽器判斷本地緩存未過期,就直接使用,無需發(fā)起http請(qǐng)求
- 協(xié)商緩存: 瀏覽器判斷本地緩存過期,發(fā)送http請(qǐng)求,服務(wù)器返回304告訴瀏覽器文件未改變,瀏覽器繼續(xù)使用本地緩存
緩存頭部
如何區(qū)分緩存類型呢?主要根據(jù)http頭部字段
屬于強(qiáng)緩存控制:
- http1.0:
Pragma/Expires - http1.1:
Cache-Control/Max-Age
ps:Max-Age不是一個(gè)頭部,而是Cache-Control的值
屬于協(xié)商緩存控制:
- http1.0:
If-Modified-Since/Last-Modified - http1.1:
If-None-Match/E-tag
http1.0和http1.1緩存頭部控制的區(qū)別
在http1.0中:
-
Pragma: 嚴(yán)格說,他不屬于專門控制緩存的頭部,但是當(dāng)其值為no-cache時(shí)可以讓本地強(qiáng)緩存失效 -
Expires: 在服務(wù)端配置,用于強(qiáng)緩存。用來控制在規(guī)定時(shí)間之前,瀏覽器不需要在發(fā)出請(qǐng)求,直接使用本地緩存。切Expires是服務(wù)端時(shí)間 -
If-Modified-Since/Last-Modified: 這兩個(gè)是成對(duì)出現(xiàn)。屬于協(xié)商緩存。其中瀏覽器端頭部為If-Modified-Since,服務(wù)器端為Last-Modified。在發(fā)送請(qǐng)求時(shí),如果If-Modified-Since和Last-Modified匹配,那么表示服務(wù)器資源為變化,服務(wù)器不會(huì)返回當(dāng)前資源。而是返回頭部,告知瀏覽器使用本地緩存。Last-Modified是指文件的最后修改時(shí)間。只能精確到1s以內(nèi)。
在http1.1中:
-
Cache-Control:緩存控制的頭部。有no-cache, max-age,no-store等值。 -
Max-Age:服務(wù)器端配置,用于強(qiáng)緩存,例如Cache-Control=max-age=3600在3600秒內(nèi),瀏覽器無需再次發(fā)出請(qǐng)求直接使用本地緩存。他的值是絕對(duì)時(shí)間,由瀏覽器自己計(jì)算。 -
If-None-Match/E-tag: 這個(gè)是成對(duì)出現(xiàn)的。屬于協(xié)商緩存。其中瀏覽器端頭部為If-None-Match,服務(wù)器端為E-tag。當(dāng)瀏覽器發(fā)出請(qǐng)求后兩者匹配,則表示服務(wù)器端資源未改變,服務(wù)器不會(huì)返回資源本身,返回頭部,瀏覽器使用本地緩存。和Last-Modified相比。E-tag更精確。沒有1s的誤差。
Max-Age 和 Expires 區(qū)別
Expires 使用的服務(wù)器時(shí)間。當(dāng)服務(wù)器時(shí)間和瀏覽器時(shí)間不同步時(shí),可能會(huì)發(fā)生緩存無效或一直無法過期的bug。
而E-tag 使用的瀏覽器時(shí)間。就不會(huì)存在上述問題。
E-tag 和 Last-Modified 區(qū)別
Last-Modified 表示的是文件的最后修改時(shí)間,有一個(gè)精確1s的缺陷,如果服務(wù)端的文件周期性改變,會(huì)導(dǎo)致緩存失效。
而E-tag是一種指紋機(jī)制。只有文件發(fā)生改變才會(huì)變化。不存在1s的缺陷。
緩存關(guān)系圖

緩存關(guān)系圖