每個(gè)瀏覽器都自帶了HTTP緩存實(shí)現(xiàn)功能。只需要確保每個(gè)服務(wù)器響應(yīng)都提供正確的HTTP響應(yīng)頭標(biāo)志尘分,以指示瀏覽器何時(shí)可以緩存響應(yīng)以及可以緩存多久。
Cache-Control
每個(gè)服務(wù)端資源可以通過(guò)Cache-Control標(biāo)志定義其緩存策略境钟。
Cache-Control控制誰(shuí)在什么條件下可以緩存響應(yīng) 以及 可以緩存多久漱挚。
max-age
指定從請(qǐng)求的時(shí)間開(kāi)始,允許獲取的響應(yīng)被重用的最長(zhǎng)時(shí)間(單位:秒)弦牡。
例如友驮,max-age=60表示可在接下來(lái)的60秒緩存和重用響應(yīng)。
-
no-cache
和no-store
no-cache 表示必須先與服務(wù)器確認(rèn)返回的響應(yīng)是否發(fā)生了變化喇伯,然后才能使用該響應(yīng)來(lái)滿(mǎn)足后續(xù)對(duì)同一網(wǎng)址的請(qǐng)求喊儡。因此拨与,如果存在合適的驗(yàn)證令牌(ETag)稻据,no-cache會(huì)發(fā)起往返通信來(lái)驗(yàn)證緩存的響應(yīng)。如果資源未發(fā)生變化,則不下載資源捻悯。
no-store 相對(duì)簡(jiǎn)單匆赃,直接禁止 瀏覽器以及所有中間緩存 存儲(chǔ)任何版本的返回響應(yīng)。例如今缚,包含個(gè)人隱私數(shù)據(jù)或銀行業(yè)務(wù)數(shù)據(jù)的響應(yīng)算柳。每次用戶(hù)請(qǐng)求該資源時(shí),都會(huì)向服務(wù)器發(fā)送請(qǐng)求姓言,并下載完整的響應(yīng)瞬项。
-
public
和private
public 表示無(wú)論什么情況(比如,有與它相關(guān)聯(lián)的驗(yàn)證ETag何荚,響應(yīng)狀態(tài)碼無(wú)法正常緩存)囱淋,響應(yīng)都可以被緩存。大多數(shù)情況下餐塘,public不是必須的妥衣,因?yàn)槊鞔_的緩存信息(如 max-age)已表示響應(yīng)是可以緩存的。
private 表示瀏覽器可以緩存這個(gè)響應(yīng)戒傻,這個(gè)響應(yīng)通常只為單個(gè)用戶(hù)緩存税手,不允許任何中間緩存對(duì)其進(jìn)行緩存。例如需纳,用戶(hù)的瀏覽器可以緩存包含用戶(hù)信息的HTML網(wǎng)頁(yè)芦倒,但CDN不可以。
例子說(shuō)明
Cache-Control: max-age=86400
瀏覽器以及任何中間緩存均可以將響應(yīng)(public響應(yīng))緩存長(zhǎng)達(dá)1天(60秒 * 60分鐘 * 24小時(shí))
Cache-Control: private不翩,max-age=600
客戶(hù)端的瀏覽器只能將響應(yīng)緩存最長(zhǎng)10分鐘(60秒 * 10分鐘)熙暴。
Cache-Control: no-store
不允許緩存響應(yīng),每次請(qǐng)求都必須完整獲取慌盯。
ETag
服務(wù)器使用ETag標(biāo)志代表驗(yàn)證令牌周霉,它可以實(shí)現(xiàn)高效的資源更新檢查,資源未發(fā)生變化時(shí)不會(huì)傳送任何數(shù)據(jù)亚皂。
ETag 可以解決max-age過(guò)期重新請(qǐng)求俱箱,但服務(wù)端資源未發(fā)生變化,重新下載效率太低的問(wèn)題灭必。
比如這樣一個(gè)場(chǎng)景:假如在首次獲取資源120秒后(max-age=120)狞谱,瀏覽器又對(duì)該資源發(fā)起了新的請(qǐng)求。首先禁漓,瀏覽器會(huì)檢查本地緩存并找到之前的響應(yīng)跟衅。可惜該響應(yīng)現(xiàn)在已過(guò)期播歼,瀏覽器無(wú)法使用伶跷。此時(shí),瀏覽器可以直接發(fā)出新的請(qǐng)求,并獲取新的完整響應(yīng)叭莫。但是這樣做效率太低蹈集,因?yàn)槿绻Y源未發(fā)生變化,那么下載 與緩存中相同 的資源雇初,則太浪費(fèi)網(wǎng)絡(luò)流量拢肆。
有了ETag就可以解決這樣的問(wèn)題場(chǎng)景。服務(wù)器生成并返回的隨機(jī)令牌ETag通常是文件內(nèi)容的哈希值 或 某個(gè)其他指紋靖诗」郑客戶(hù)端只需在下一次請(qǐng)求時(shí),將其(ETag)發(fā)送至服務(wù)器刊橘。如果ETag仍然相同移盆,則表示資源未發(fā)生變化,可以跳過(guò)下載伤为。
例如上面圖片咒循,客戶(hù)端自動(dòng)在If-None-Match的HTTP請(qǐng)求頭中請(qǐng)求ETag令牌。服務(wù)器根據(jù)當(dāng)前資源核對(duì)令牌绞愚。如果它未發(fā)生變化叙甸,服務(wù)器將返回304 Not Modified響應(yīng),告知瀏覽器緩存中的響應(yīng)未發(fā)生變化位衩,可以再延用120秒裆蒸。這樣瀏覽器就不用再次下載響應(yīng),節(jié)約時(shí)間和帶寬糖驴。
range & Content-Range
HTTP1.1 協(xié)議(RFC2616)開(kāi)始支持獲取文件的部分內(nèi)容僚祷,從而支持HTTP斷點(diǎn)續(xù)傳≈疲客戶(hù)端的請(qǐng)求頭對(duì)應(yīng)的參數(shù)是range
辙谜,服務(wù)端的響應(yīng)頭對(duì)應(yīng)的參數(shù)是Content-Range
range
請(qǐng)求頭的參數(shù),一般格式如下:
range: (unit=first byte pos)-[last byte pos]
指定第一個(gè)字節(jié)的位置和最后一個(gè)字節(jié)的位置感昼。
例子說(shuō)明
range: bytes=0-7569
表示第 0-7569 字節(jié)范圍的內(nèi)容
range: bytes=-7569
表示最后7569字節(jié)的內(nèi)容
range: bytes=0-
表示從第0字節(jié)開(kāi)始到文件結(jié)束部分的內(nèi)容
range: bytes=0-0,-1
表示第一個(gè)和最后一個(gè)字節(jié)
range: bytes=100-200,400-500,600-700
同時(shí)指定幾個(gè)范圍
Content-Range
響應(yīng)頭的參數(shù)装哆,服務(wù)器返回當(dāng)前接受的范圍和文件總大小。一般格式如下:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
例子說(shuō)明
Content-Range: bytes 0-7569/50000
0-7569指當(dāng)期發(fā)送的數(shù)據(jù)范圍定嗓,50000指文件的總大小
在響應(yīng)完成后蜕琴,返回的響應(yīng)頭內(nèi)容表示不同的意思
HTTP/1.1 200 Ok(不使用斷點(diǎn)續(xù)傳方式)
HTTP/1.1 206 Partial Content(使用斷點(diǎn)續(xù)傳方式)
參考