http 304: not modified
標(biāo)準(zhǔn)解釋是:not modified 客戶端有緩沖地文檔并發(fā)出了一個條件性地請求(一般是提供if-modified-since頭表示客戶只想比指定日期更新地文檔).服務(wù)器告訴客戶,原來緩沖地文檔還可以繼續(xù)使用.
我們先來看下瀏覽器地工作原理:
(1)直接在緩存中去獲取內(nèi)容.如果先前有效訪問地響應(yīng)頭包含 expires, max-age地話,“打開新窗口”、“輸入uri回車”、“前一頁”、“后一頁”這些瀏覽器行為不會使瀏覽器在expires, max-age設(shè)置地有效期時間內(nèi)去訪問服務(wù)器,而是在緩存中去獲取內(nèi)容,但是刷新'或重載例外.
(2)訪問服務(wù)器,根據(jù)服務(wù)器響應(yīng)來獲取內(nèi)容.這種情況發(fā)生在設(shè)置no-cache等頭標(biāo)要求不緩存,或者是設(shè)置了 expires,max-age但瀏覽器行為是“刷新”或“重載”時候.'last-modified'、'etag'、'must-revalidate' 等有些特殊,不直接受瀏覽器行為影響,它們必須訪問服務(wù)器后,再由服務(wù)器判斷是直接發(fā)送新地資源,還是發(fā)送一個304 not modfied讓瀏覽器使用緩存中地資源.
如果客戶端在請求一個文件地時候,發(fā)現(xiàn)自己緩存地文件有 last modified ,那么在請求中會包含 if modified since ,這個時間就是緩存文件地 last modified .因此,如果請求中包含 if modified since,就說明已經(jīng)有緩存在客戶端.只要判斷這個時間和當(dāng)前請求地文件地修改時間就可以確定是返回 304 還是 200 .對于靜態(tài)文件,例如:css、圖片,服務(wù)器會自動完成 last modified 和 if modified since 地比較,完成緩存或者更新.但是對于動態(tài)頁面,就是動態(tài)產(chǎn)生地頁面,往往沒有包含 last modified 信息,這樣瀏覽器、網(wǎng)關(guān)等都不會做緩存,也就是在每次請求地時候都完成一個 200 地請求.
因此,對于動態(tài)頁面做緩存加速,首先要在 response 地 http header 中增加 last modified 定義,其次根據(jù) request 中地 if modified since 和被請求內(nèi)容地更新時間來返回 200 或者 304 .雖然在返回 304 地時候已經(jīng)做了一次數(shù)據(jù)庫查詢,但是可以避免接下來更多地數(shù)據(jù)庫查詢,并且沒有返回頁面內(nèi)容而只是一個 http header,從而大大地降低帶寬地消耗,對于用戶地感覺也是提高.
如何測試http狀態(tài),緩存是否有效?
可以使用httpwatch
第一次訪問 200
鼠標(biāo)點擊二次訪問 (cache)
按f5刷新 304
按ctrl+f5強(qiáng)制刷新 200
如果是這樣地就說明緩存真正有效了.
對 http 304 地理解
最近和同事一起看web地cache問題,又進(jìn)一步理解了 http 中地 304 又有了一些了解.
304 地標(biāo)準(zhǔn)解釋是:not modified 客戶端有緩沖地文檔并發(fā)出了一個條件性地請求(一般是提供if-modified-since頭表示客戶只想比指定日期更新地文檔).服務(wù)器告訴客戶,原來緩沖地文檔還可以繼續(xù)使用.
如 果客戶端在請求一個文件地時候,發(fā)現(xiàn)自己緩存地文件有 last modified ,那么在請求中會包含 if modified since ,這個時間就是緩存文件地 last modified .因此,如果請求中包含 if modified since,就說明已經(jīng)有緩存在客戶端.只要判斷這個時間和當(dāng)前請求地文件地修改時間就可以確定是返回 304 還是 200 .對于靜態(tài)文件,例如:css、圖片,服務(wù)器會自動完成 last modified 和 if modified since 地比較,完成緩存或者更新.但是對于動態(tài)頁面,就是動態(tài)產(chǎn)生地頁面,往往沒有包含 last modified 信息,這樣瀏覽器、網(wǎng)關(guān)等都不會做緩存,也就是在每次請求地時候都完成一個 200 地請求.
因此,對于動態(tài)頁面做緩存加速,首先要在 response 地 http header 中增加 last modified 定義,其次根據(jù) request 中地 if modified since 和被請求內(nèi)容地更新時間來返回 200 或者 304 .雖然在返回 304 地時候已經(jīng)做了一次數(shù)據(jù)庫查詢,但是可以避免接下來更多地數(shù)據(jù)庫查詢,并且沒有返回頁面內(nèi)容而只是一個 http header,從而大大地降低帶寬地消耗,對于用戶地感覺也是提高.
當(dāng)這些緩存有效地時候,通過 httpwatch 查看一個請求會的到這樣地結(jié)果:
第一次訪問 200
鼠標(biāo)點擊二次訪問 (cache)
按f5刷新 304
按ctrl+f5強(qiáng)制刷新 200
如果是這樣地就說明緩存真正有效了.以上就是我對 http 304 地一個理解.
更多信息請查看IT技術(shù)專欄