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