首先怒炸,什么是HTTP緩存恩敌,先大概說一下。
Http緩存分兩種横媚,一種強制緩存,一種協(xié)商緩存月趟。
一般Http只能緩存get請求返回的資源灯蝴,然后
Http緩存發(fā)生在第一次請求之后,(不包括第一次哦)
第一次正常請求孝宗,服務器返回資源穷躁。
從第二次請求開始,瀏覽器進行請求參數(shù)的判斷因妇,如果命中了強制緩存问潭,則狀態(tài)碼200,在本地緩存中直接讀取資源婚被。否則則會發(fā)起請求狡忙,服務器經(jīng)過請求頭中的緩存參數(shù)進行判斷是否命中協(xié)商緩存,如果命中協(xié)商緩存址芯,則不返回資源灾茁,狀態(tài)碼返回304窜觉,從本地緩存中讀取資源,其他情況則服務器返回資源北专。
下邊稍微深入點說說上邊的細節(jié)禀挫,
那么上邊說了通過請求頭的參數(shù)判斷 強制緩存 / 協(xié)商緩存, 那么是哪些參數(shù)呢拓颓?
強制緩存: Pragma, CaChe-Control, Expires
協(xié)商緩存: ETag/if-Not-Match, Last-Modified/if-Modified-Since
Pragma
可選值:no-cache(不直接使用緩存语婴,根據(jù)新鮮度來使用緩存)
注意點:
1.它的優(yōu)先級是最高的;
2.響應頭 不支持這個屬性驶睦;
3.在HTTP/1.1中已經(jīng)被廢棄了
Cache-Control
可選值:
1.no-cache(不直接使用緩存砰左,根據(jù)新鮮度來使用緩存)
2.no-store(不使用緩存,每次都是請求下載新資源)
3.max-age:xx秒(緩存時長)
4.public/private(是否只能被單個用戶使用,默認是private)
5.must-revalidate(每次訪問需要緩存校驗)
注意點:
1.它的優(yōu)先級次于Pragma
2.用于HTTP/1.0之后(不包含1.0)
3.在緩存未失效前,獲取不到修改后的資源
Expires
可選值:GMT時間
注意點:
1.它的優(yōu)先級在強制緩存中是最低的
2.在緩存未失效前函匕,獲取不到修改后的資源
3.可用于HTTP版本 1.0+
接下來就是協(xié)商緩存嘱兼,協(xié)商緩存有兩組,ETag / if-not-Match 是一對
第一次請求之后服務器返回數(shù)據(jù)庆捺,在返回頭中有ETag屬性,ETag的值是一個由服務器端生成的一個序列值,一般是個hash值嫡意,然后在客戶端下一次請求此數(shù)據(jù)的時候會在請求頭中攜帶上if-not-Match屬性,值則是Etag返回的那個值捣辆,服務器收到請求后會對比此值是否相同蔬螟,來判斷是否需要返回新的資源。它非常的精準汽畴,可以計算一秒內(nèi)的多次修改旧巾,但是它的計算會耗費性能。
另外一組是 last-Modified / if-Modified-Since
第一次請求之后服務器返回數(shù)據(jù)忍些,在返回頭中有l(wèi)ast-Modified屬性鲁猩,last-Modified的值是GMT格式的時間,代表著資源最后一次修改的時間罢坝,然后在客戶端下一次請求此數(shù)據(jù)的時候會在請求頭中攜帶上last-Modified-Since屬性廓握,值則是Last-Modified返回的GMT時間,服務器收到請求后會對比此值是否相同嘁酿,來判斷是否需要返回新的資源隙券。它以秒為單位,監(jiān)聽不到在一秒內(nèi)的多次修改闹司,所以不是絕對精確娱仔。