304狀態(tài)碼詳解(協(xié)商緩存)
304狀態(tài)碼詳解(協(xié)商緩存)
上一篇文章針對不同的狀態(tài)碼做了一個整理,還說到要專門針對304做一個詳解,于是與,今晚又來學(xué)習(xí)了。
首先說一下背景:
我們知道前端代碼打包后需要部署到靜態(tài)服務(wù)器上。客戶端通過輸入url就能看到對應(yīng)的頁面。從客戶端到服務(wù)器發(fā)送請求到接收資源需要建立連接、消耗寬帶。
但是靜態(tài)資源的更改頻率往往沒有那么高,于是就有一些專門的response header設(shè)置。通過這些設(shè)置讓瀏覽器在獲取資源文件時直接從本地硬盤或者內(nèi)存獲取,而不必再發(fā)送請求。這樣也減輕了服務(wù)器的負(fù)擔(dān),同時還加快了客戶端的網(wǎng)頁加載速度,用戶體驗好。
設(shè)置方式:
1、通過expires(http1時的規(guī)范,目前是向下兼容所以有的網(wǎng)站還在用這個):它的值是一個絕對時間的GMT時間字符串。
2、cache-control字段:該字段有幾個可選值包括no-cache、no-store、public、private等,這些值決定了能否使用緩存以及緩存的方式。
no-cache時,代表不使用本地緩存,客戶端會向服務(wù)器發(fā)送請求,由服務(wù)器決定是否重新獲取資源。
no-store時,會完整下載資源
public時:表示資源可以被所有用戶緩存,包括服務(wù)器
private時表示資源只能被瀏覽器終端緩存
如果兩者同時存在,cache-control優(yōu)先級更高一些。
當(dāng)我們發(fā)送請求讓瀏覽器進(jìn)行判斷時,客戶端和服務(wù)器需要一些標(biāo)識來進(jìn)行通訊
比如If-Modified-Since和If-None-Match字段
這兩個字段的值通過第一次請求的response header中的last-modified、etag攜帶過來。
示例
// response header etag: '5c20abbd-e2e8' last-modified: Mon, 24 Dec 2018 09:49:49 GMT // request header 變?yōu)?if-none-matched: '5c20abbd-e2e8' if-modified-since: Mon, 24 Dec 2018 09:49:49 GMT
瀏覽器沒有命中強(qiáng)緩存并走協(xié)商緩存時就把這些值跟資源文件的信息進(jìn)行比對。
如果資源沒更改,返回304,瀏覽器讀取本地緩存。 如果資源有更改,返回200,返回最新的資源。
至于為什么有etag和last-modified兩個字段主要是解決服務(wù)器不能精確事件的問題而新增了etag導(dǎo)致的,兩個判斷相輔相成,具體如何決策看服務(wù)器如何處理了
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。