前言
本文是閱讀文章所做筆記。意在加深記憶也便于日后查找
強緩存和協(xié)商緩存
http的緩存機制可以分為兩種類型:
- 強緩存:瀏覽器判斷本地緩存未過期变骡,就直接使用仲义,無需發(fā)起http請求
- 協(xié)商緩存: 瀏覽器判斷本地緩存過期滥玷,發(fā)送http請求为狸,服務器返回304告訴瀏覽器文件未改變,瀏覽器繼續(xù)使用本地緩存
緩存頭部
如何區(qū)分緩存類型呢互捌?主要根據(jù)http頭部字段
屬于強緩存控制:
- http1.0:
Pragma
/Expires
- http1.1:
Cache-Control
/Max-Age
ps:Max-Age
不是一個頭部潘明,而是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
: 嚴格說,他不屬于專門控制緩存的頭部秕噪,但是當其值為no-cache
時可以讓本地強緩存失效 -
Expires
: 在服務端配置钳降,用于強緩存。用來控制在規(guī)定時間之前腌巾,瀏覽器不需要在發(fā)出請求遂填,直接使用本地緩存铲觉。切Expires是服務端時間 -
If-Modified-Since
/Last-Modified
: 這兩個是成對出現(xiàn)。屬于協(xié)商緩存吓坚。其中瀏覽器端頭部為If-Modified-Since
,服務器端為Last-Modified
撵幽。在發(fā)送請求時,如果If-Modified-Since
和Last-Modified
匹配礁击,那么表示服務器資源為變化盐杂,服務器不會返回當前資源。而是返回頭部哆窿,告知瀏覽器使用本地緩存链烈。Last-Modified
是指文件的最后修改時間。只能精確到1s以內挚躯。
在http1.1中:
-
Cache-Control
:緩存控制的頭部强衡。有no-cache, max-age,no-store等值。 -
Max-Age
:服務器端配置码荔,用于強緩存漩勤,例如Cache-Control=max-age=3600
在3600秒內,瀏覽器無需再次發(fā)出請求直接使用本地緩存目胡。他的值是絕對時間锯七,由瀏覽器自己計算。 -
If-None-Match
/E-tag
: 這個是成對出現(xiàn)的誉己。屬于協(xié)商緩存。其中瀏覽器端頭部為If-None-Match
,服務器端為E-tag
域蜗。當瀏覽器發(fā)出請求后兩者匹配巨双,則表示服務器端資源未改變,服務器不會返回資源本身霉祸,返回頭部筑累,瀏覽器使用本地緩存。和Last-Modified
相比丝蹭。E-tag
更精確慢宗。沒有1s的誤差。
Max-Age 和 Expires 區(qū)別
Expires
使用的服務器時間奔穿。當服務器時間和瀏覽器時間不同步時镜沽,可能會發(fā)生緩存無效或一直無法過期的bug。
而E-tag
使用的瀏覽器時間贱田。就不會存在上述問題缅茉。
E-tag 和 Last-Modified 區(qū)別
Last-Modified
表示的是文件的最后修改時間,有一個精確1s的缺陷男摧,如果服務端的文件周期性改變蔬墩,會導致緩存失效译打。
而E-tag
是一種指紋機制。只有文件發(fā)生改變才會變化拇颅。不存在1s的缺陷奏司。
緩存關系圖
緩存關系圖