控制緩存的相關(guān)字段:
1.Pragma
:是HTTP1.0標(biāo)準(zhǔn)中定義的一個header
屬性变丧。請求(字段)中包含Pragma的效果跟在頭信息中定義Cache-Control: no-cache相同深寥,但是HTTP的響應(yīng)頭沒有明確定義這個屬性有滑,所以它不能拿來完全替代HTTP/1.1中定義的Cache-control頭媒咳。
2.Expires
:是HTTP/1.0設(shè)置緩存過期時間的空免,Expires響應(yīng)字段包含了資源過期的日期和時間(相對于服務(wù)器時間)顽染。如果Cache-Control
中設(shè)置了max-age
或s-max-age
,那么Expires
頭被忽略狸臣。如果該字段與Pragma
同時存在時莹桅,Pragma
起作用。
3.Cache-control
:HTTP/1.1烛亦,用來控制緩存行為诈泼。通過它提供的不同的值來定義緩存策略懂拾。請求頭和響應(yīng)頭都支持這個屬性。
常用取值:
-
Cache-Control: no-store
:禁止進(jìn)行緩存铐达。 -
Cache-Control: no-cache
:強(qiáng)制確認(rèn)緩存岖赋。每次請求發(fā)出時,緩存會將此請求發(fā)送到服務(wù)器瓮孙,服務(wù)端會驗(yàn)證請求中描述的緩存是否過期唐断,若未過期返回304,使用本地緩存杭抠。 -
Cache-Control: max-age=<seconds>
:緩存過期機(jī)制脸甘。資源能被緩存的最大時間,是距離請求發(fā)起的時間的秒數(shù)祈争。 -
Cache-Control: must-revalidate
:緩存驗(yàn)證確認(rèn)斤程。有該頭部時,意味著使用緩存前就會進(jìn)行緩存狀態(tài)驗(yàn)證菩混。 -
Cache-Control: public/private
:當(dāng)為public
時,表示響應(yīng)可被任何中間代理扁藕、CDN等緩存沮峡;private
(默認(rèn)值)表示響應(yīng)專用于某個用戶,只能應(yīng)用于瀏覽器私有緩存中亿柑。
4.Last-Modified
:是HTTP/1.1規(guī)定的一個響應(yīng)的首部邢疙,資源最后一次被修改的時間。服務(wù)器將資源傳遞給客戶端時望薄,會將資源最后更改的時間以Last-Modified: GMT
的形式加在實(shí)體首部上一起返回給客戶端疟游。客戶端會為資源標(biāo)記上該信息痕支,下次再次請求時颁虐,會把該信息附帶在請求報文中一并帶給服務(wù)器去做檢查,若傳遞的時間值與服務(wù)器上該資源最終修改時間是一致的卧须,則說明該資源沒有被修改過另绩,直接返回304狀態(tài)碼,內(nèi)容為空花嘶。當(dāng)響應(yīng)的頭部包含該字段笋籽,后續(xù)的請求就會帶上If-Modified-Since
或 If-Unmodified-Since
(值都為Last-Modified
值)來驗(yàn)證緩存。
??
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
5.ETag
:緩存的強(qiáng)校驗(yàn)器椭员。服務(wù)端會根據(jù)某種算法车海,給資源算出一個唯一標(biāo)識,把資源響應(yīng)給客戶端時隘击,會帶上ETag: 唯一標(biāo)識
客戶端會保留該 ETag
字段侍芝,并在下一次請求時將其一并帶過去給服務(wù)器研铆。服務(wù)器比較客戶端傳來的ETag
跟自己服務(wù)器上該資源的ETag
是否一致,來判斷資源是否修改過竭贩。
如果服務(wù)器發(fā)現(xiàn)ETag
匹配不上蚜印,那么直接以常規(guī)GET 200
回包形式將新的資源(包括新的ETag
)發(fā)給客戶端;如果ETag
是一致的留量,則直接返回304
知會客戶端直接使用本地緩存即可窄赋。
客戶端通過If-None-Match
或If-match
字段將ETag
值傳給服務(wù)器。
以上字段有什么關(guān)聯(lián)楼熄?
在HTTP1.0中忆绰,因?yàn)樵O(shè)置緩存的過期時間Expires
是相對于服務(wù)器時間而言的,如果客戶端時間和服務(wù)器端時間不一致就會有問題可岂,于是在HTTP1.1中提出了Cache-Control
错敢,該字段是一個通用屬性(請求和響應(yīng)頭中均支持),它是通過設(shè)置時間段來指定緩存過期時間的缕粹。
緩存校驗(yàn):
如果緩存已過期稚茅,但服務(wù)器資源未更新,再次請求時會返回和緩存內(nèi)容一樣的資源平斩,無疑這是沒必要的亚享。所以,HTTP1.1又新增了Last-Modified
字段做緩存校驗(yàn)绘面。但假如服務(wù)器上的資源發(fā)生更改了欺税,但實(shí)際內(nèi)容沒有發(fā)生改變,也是沒必要重新返回資源揭璃。所以晚凿,ETag
就出現(xiàn)了。
優(yōu)先級:Pragma > Cache-Control > Expires > Last-Modified
為了向下兼容瘦馍,很多網(wǎng)站還是會帶Expires
和Pragma
字段歼秽。
?扣墩?服務(wù)端是如何去設(shè)置緩存的哲银?具體的業(yè)務(wù)場景有哪些。
呻惕?荆责?假如用Cache-Control: max-age=<seconds>
設(shè)置緩存過期時間,在緩存未過期時亚脆,請求都會從緩存中拿數(shù)據(jù)做院,但當(dāng)此時的服務(wù)器資源已經(jīng)更新,如何使請求在服務(wù)器資源更新時拿到最新數(shù)據(jù)?