摘要:上一篇文章梳理緩存的關(guān)鍵路徑。這條路徑的完成,依賴于協(xié)議。首次驗證相關(guān)協(xié)議服務(wù)器在響應(yīng)報文中設(shè)置或,緩存器對資源進(jìn)行緩存。再次請求同一資源時,緩存器通過檢查和,決定緩存是否過期的過程稱為首次驗證。因此,有雙向控制緩存的能力。
上一篇文章 梳理 HTTP 緩存的關(guān)鍵路徑。瀏覽器發(fā)起 HTTP 請求,請求報文發(fā)往瀏覽器內(nèi)置的緩存器,緩存器經(jīng)過首次驗證,再決定是否向服務(wù)器發(fā)起緩存的再次驗證。這條路徑的完成,依賴于 HTTP 協(xié)議。
1. 首次驗證相關(guān)協(xié)議服務(wù)器在響應(yīng)報文中設(shè)置 Cache-Control 或 Expire,緩存器對資源進(jìn)行緩存。
再次請求同一資源時,緩存器通過檢查 Cache-Control:max-age 和 Expire,決定緩存是否過期的過程稱為首次驗證。
將 Cache-Control 的取值拆解為三部分,如下圖
三部分都是可選的。
第一部分決定是否有緩存,或者在哪里緩存,這條指令有4個取值:
public:可以緩存,且即可本地緩存,也可以共享緩存(例如CDN)
private:可以緩存,但只允許本地緩存
no-cache:告訴客戶端,不能直接使用緩存。需要經(jīng)過服務(wù)器再次驗證后,才決定是否使用緩存(服務(wù)器返回 304 才可用)
no-store:不允許緩存
第二部分決定緩存的有效時間,以秒為單位,有兩種取值
max-age,例如 max-age=3000,即告訴客戶端和共享緩存可以緩存3000秒
s-maxage,例如 s-maxage=1000,即告訴共享緩存可以緩存1000秒
第三部分控制客戶端向服務(wù)器發(fā)起再次驗證,它有三個取值
must-revalidate 告訴客戶端必須向服務(wù)器發(fā)起再次驗證,即使本地緩存還沒過期(Cache-Control: max-age 或 Expire 還在有效期內(nèi))
proxy-revalidate 告訴共享緩存必須向源服務(wù)器發(fā)起再驗證,即使共享緩存還未過期
immutable 指明文檔是不可更改的
2. 以上都提到共享緩存,它是什么?共享緩存相對于本地緩存,像瀏覽器內(nèi)置緩存這種只為當(dāng)前用戶提供緩存服務(wù)的稱為本地緩存,而像CDN這種為一個區(qū)域的用戶提供緩存服務(wù)的稱為共享緩存。所以 HTTP 緩存的關(guān)鍵路徑,在上 一篇文章 的甚礎(chǔ)上,加一個共享緩存。它不是必要的。
假設(shè)一個網(wǎng)站服務(wù)于全局的用戶 U,在服務(wù)器下流有N個共享緩存,服務(wù)于N個區(qū)域的用戶。補(bǔ)充進(jìn)來之后的路徑如下:
3. 舉些例子服務(wù)器在響應(yīng)請求的時候,設(shè)置 Cache-Control ,不同取值含義分別是
Cache-Control: public max-age=3600 表示本地緩存和共享緩存的有效時間為3600秒。此處如果沒有 public 效果一樣,即在沒有指明是 private 的情況下,都是 public
Cache-Control: no-cache 表示可以緩存,但使用緩存前,必須通過 ETag 或 Last-Modified 向服務(wù)器發(fā)起再驗證,如果服務(wù)器響應(yīng) 304 則可用,否則不可。
Cache-Control: no-store 表示不可緩存資源。
Cache-Control: max-age=3600 s-maxage=7200 表示本地緩存有效期為 3600 秒,而共享緩存是 7200 秒。
4. 瀏覽器通過 Cache-Control 影響緩存行為不僅服務(wù)器可以通過 Cache-Control 影響緩存器,瀏覽器也可以。它的取值有no-cache、no-store、max-age max-stale 等,具體的含義不在此處細(xì)說,可查《HTTP權(quán)威指南》。
5. 服務(wù)器再驗證因此,Cache-Control 有雙向控制緩存的能力。服務(wù)器通過響應(yīng)報文設(shè)置 Cache-Control
影響怎么設(shè)置緩存;而瀏覽器通過請求報文設(shè)置 Cache-Control 影響怎么使用緩存。Expire 只有在響應(yīng)報文中有效,其作用與
Cache-Control:max-age 一樣,不同的是 max-age 是相對值,Expire 是絕對值。max-age
告訴緩存可以緩存多久(例如 3600 秒), Expire 告訴緩存可以緩存到什么時候(例如 Sat, 29 Jul 2017
03:22:20 GMT )
如果首次驗證發(fā)現(xiàn)緩存已經(jīng)超過有效期(Cache-Control:max-age 和 Expire 已經(jīng)過期),此時緩存有可能依然存在,但不能直接使用。需要向服務(wù)器發(fā)請驗證,由服務(wù)器決定是否可用,這個過程稱為服務(wù)器再驗證。
舉例說明:
首次請求文件,服務(wù)器在響應(yīng)報文中設(shè)置如下緩存信息,緩存器收到報文,根據(jù) Cache-Control 和 Expire 緩存文件,記錄有效期為1天。同時記錄下該文件的 ETag 和 Last-Modified。
Cache-Control:max-age=86400 ETag:"597839c9-16c3" Expires:Sat, 29 Jul 2017 03:22:20 GMT Last-Modified:Wed, 26 Jul 2017 06:42:17 GMT
一天后,再次請求該文件,此時如果用戶并非清除緩存,并且緩存還未被緩存器清除。緩存器將會檢測到該請求存在緩存,但此時緩存已經(jīng)超過有效期,于是在請求報文里設(shè)置 If-None-Match 和 If-Modified-Since,取值分別為該文件的 ETag 和 Last-Modified。
服務(wù)器收到報文,檢測文件的上次修改時間是否與報文中的 If-Modified-Since 一樣,同時檢測資源的 ETag 是否與報文中的 If-None-Match 一樣。如果都一樣,認(rèn)為緩存器的緩存仍然可以繼續(xù)使用,響應(yīng) 304 的狀態(tài)碼,緩存器收到響應(yīng)后,將本地的緩存文件響應(yīng)給瀏覽器。
請求報文如下
If-None-Match:"597839c9-16c3" if-Modified-Since: Wed, 26 Jul 2017 06:42:17 GMT
流程圖如下
相關(guān)文章
HTTP 緩存的關(guān)鍵路徑
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/61879.html
摘要:協(xié)商緩存用戶發(fā)送的請求,發(fā)送到服務(wù)器后,由服務(wù)器判定是否從緩存中獲取資源。如果想主動清除緩存,也可以在請求頭信息中加入來禁止緩存。主要取值如下緩存的時效由決定。是的字段,而是的字段,當(dāng)與同時存在時,的優(yōu)先級要高于。 在講這幾個屬性之前,先復(fù)習(xí)下瀏覽器的緩存機(jī)制,再結(jié)合了解一下Last-Modified / If-Modified-Since、Etag / If-Match、cache-...
摘要:協(xié)商緩存用戶發(fā)送的請求,發(fā)送到服務(wù)器后,由服務(wù)器判定是否從緩存中獲取資源。如果想主動清除緩存,也可以在請求頭信息中加入來禁止緩存。主要取值如下緩存的時效由決定。是的字段,而是的字段,當(dāng)與同時存在時,的優(yōu)先級要高于。 在講這幾個屬性之前,先復(fù)習(xí)下瀏覽器的緩存機(jī)制,再結(jié)合了解一下Last-Modified / If-Modified-Since、Etag / If-Match、cache-...
摘要:緩存緩存主要是通過請求和響應(yīng)報文頭中的對應(yīng)信息,來控制緩存的策略。就會返回一個的狀態(tài)碼,表示可以繼續(xù)使用客戶端本地緩存的數(shù)據(jù),并刷新超時時間。與之相對的,則表示當(dāng)前響應(yīng)是針對單個用戶的,并非通用數(shù)據(jù),因此不建議任何中間緩存對其進(jìn)行緩存。 showImg(https://segmentfault.com/img/remote/1460000015383634?w=1080&h=720);...
閱讀 1382·2021-11-22 09:34
閱讀 2587·2021-11-12 10:36
閱讀 1119·2021-11-11 16:55
閱讀 2332·2020-06-22 14:43
閱讀 1473·2019-08-30 15:55
閱讀 1986·2019-08-30 15:53
閱讀 1772·2019-08-30 10:50
閱讀 1230·2019-08-29 12:15