前端小夥伴們,很多時候會在工作中或者面試中遇見Cache-Control這個欄位帶來的功能,比如有時候會在面試中怎麼實現強制快取之類的。不要怕今天我們們就看看Cache-Control的神祕之處。
單單一個通用的首部欄位Cache-Control的值就有十幾種,其中包含了請求首部可攜帶的和響應首部攜帶的。
我們們先看看請求首部Cache-Control的值
1、no-cache
當客戶端請求時攜帶這個首部欄位的時候,通過中間的快取伺服器時,會不去拿快取資源,而是讓中間伺服器轉發給資源伺服器,資源伺服器看看一下這個資源過期沒有,如果沒有就會告知中間伺服器,可以使用快取資源。否則資源伺服器就會直接返回新的資源。
2、no-store
這個欄位非常有意思,就是告知伺服器或者客戶端以及中間伺服器,我請求或者響應的內容裡面有機密資訊,這些響應的內容是永遠不會得到響應的。
3、max-age
max-age
指令標示了客戶端不願意接收一個age
大於設定時間的響應,這個欄位表達是最大快取時長,請求中單單新增這個欄位,實現不了快取時長,必須結合響應的max-age。一會,會在響應中的max-age 詳細說明
4、max-stale
這個指令表達的是快取時長過期以後,還可以有效。比如現在max-age:60秒,那麼max-stale:60秒,現在的快取時長就是120秒,
5、min-fresh
設定能夠容忍的最小新鮮度(快取時長)。min-fresh
標示了客戶端不願意接受新鮮度不多於當前的age
加上min-fresh
設定的時間之和的響應。
6、no-transfrom
使用 no-transform 指令規定無論是在請求還是響應中,快取都不能改 變實體主體的媒體型別。
7、only-if-cache
使用 only-if-cached 指令表示客戶端僅在快取伺服器本地快取目標資源的情況下,才會要求其返回。換言之,該指令要求快取伺服器不重新載入響應,也不會再次確認資源有效性。若發生請求快取伺服器的本 地快取無響應,則返回狀態碼 504 Gateway Timeout。
8、cache-extension
通過 cache-extension 標記(token),可以擴充套件 Cache-Control 首部字 段內的指令。
我們們在看看請求首部Cache-Control的值
1、pulic
這個欄位和private是相對的,Cache-Control: public時,則表明所有的使用者在通過快取伺服器的時候,都可以快取這個資源。
2、private
這個欄位和pulic是相對的,Cache-Control: private時,則表明只有某個在通過快取伺服器的時候,得到快取資源
3、no-cache
如果伺服器返回的響應中包含 no-cache 指令,那麼快取伺服器不能對 資源進行快取。源伺服器以後也將不再對快取伺服器請求中提出的資 源有效性進行確認,且禁止其對響應資源進行快取操作。
4、no-store
同請求首部的no-store指令一樣
5、no-transfrom
同請求首部的no-transfrom指令一樣
6、max-age
在Response中設定max-age的時間資訊,可以在客戶端生成快取檔案,在快取不過期的情況下,客戶端不會直接向伺服器請求資料,在快取過期的情況下,客戶端會向伺服器直接請求生成新的快取。
如果同時設定了Response和Request中的max-age 快取時間,如果Request中的max-age時間小於Response中的max-age時間,客戶端會根據Request中max-age時間週期去直接進行網路請求,如果碰到斷網或者網路請求不通的情況,即使快取還在有效期內(Response中設定的max-age時間足夠大),在Request設定的max-age過期之後,APP也會直接去進行網路請求。
因此可以考慮在客戶端的設計中一個和好的網路快取場景,用Response的max-age控制快取的時間,用Request中max-age控制重新整理的時間和機制
應用 HTTP/1.1 版本的快取伺服器遇到同時存在 Expires 首部欄位的情 況時,會優先處理 max-age 指令,而忽略掉 Expires 首部欄位。而 HTTP/1.0 版本的快取伺服器的情況卻相反,max-age 指令會被忽略
7、s-max-age
和max-age類似,它們的不同點是 s- maxage 指令只適用於供多位使用者使用的公共快取伺服器
8、must-revalidate
使用 must-revalidate 指令,代理會向源伺服器再次驗證即將返回的響 應快取目前是否仍然有效。
若代理無法連通源伺服器再次獲取有效資源的話,快取必須給客戶端 一條 504(Gateway Timeout)狀態碼。
另外,使用 must-revalidate 指令會忽略請求的 max-stale 指令(即使已 經在首部使用了 max-stale,也不會再有效果)。
9、proxy-revalidate
proxy-revalidate 指令要求所有的快取伺服器在接收到客戶端帶有該指 令的請求返回響應之前,必須再次驗證快取的有效性。
10、cache-extension
同請求首部的cache-extension指令一樣