Cache-Control欄位值詳解

zhangfaliang發表於2019-01-03

前端小夥伴們,很多時候會在工作中或者面試中遇見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指令一樣


相關文章