HTTP 304狀態(tài)分析
發(fā)布時間:2013-04-14 14:28:04 作者:佚名
我要評論

今天在查看web服務(wù)器日志的時候看到有很多304的http狀態(tài),為什么會返回304而不是200呢?這與服務(wù)器的緩存設(shè)置非常有關(guān)
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)點(diǎn)擊二次訪問 (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)點(diǎn)擊二次訪問 (Cache)
按F5刷新 304
按Ctrl+F5強(qiáng)制刷新 200
如果是這樣的就說明緩存真正有效了。以上就是我對 HTTP 304 的一個理解。
標(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)點(diǎn)擊二次訪問 (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)點(diǎn)擊二次訪問 (Cache)
按F5刷新 304
按Ctrl+F5強(qiáng)制刷新 200
如果是這樣的就說明緩存真正有效了。以上就是我對 HTTP 304 的一個理解。
相關(guān)文章
- 之前寫過一個微信公眾訂閱號申請的步驟但是不論從圖片還是文字說明來說,都不是很詳細(xì),所以最近重新申請了個新的微信訂閱號,一是看下現(xiàn)在申請訂閱號的步驟有沒有變化,二2014-05-04
- 阿里巴巴這個公司想必大家都知道,無論哪個專業(yè)的同學(xué)2009-05-06
- 百度收錄的大更新時間是每月11號和26號,特別是26號,更新幅度最大,K站也是最多的。2011-03-02
網(wǎng)站地址欄前面的小圖標(biāo)favicon.ico制作方法
有人也許會好奇,有的網(wǎng)址前面有個漂亮的小圖標(biāo)而且有的網(wǎng)站圖標(biāo)還會動,這是怎么做的呢?2010-01-27- 我們在申請微信自定義菜單時,要用到appid和appsecret,如何獲得appid和appsecret呢?下面我會詳細(xì)介紹2014-05-15
單臺服務(wù)器每天最多能承受20萬獨(dú)立IP的訪問量
本文所指網(wǎng)站的內(nèi)容僅為WEB站點(diǎn),如果是視頻游戲網(wǎng)站可能在1000IP以下,視 頻 聊 天最多能承受1000IP左右,文字聊天室大約3000IP,上傳類網(wǎng)站數(shù)千IP2012-11-10- 跳出度是網(wǎng)站分析中一個最基本的概念,但在分析跳出率時卻還是經(jīng)常出現(xiàn)各種各樣的問題,網(wǎng)絡(luò)上跳出率的文章已有不少,這里會對跳出率的分析常遇到的一些問題與陷阱作了整理2012-08-01
- 現(xiàn)在很多站長都想做自己網(wǎng)站的移動網(wǎng)站,那具體怎么做呢?下文給出了詳細(xì)的介紹分享給大家2014-01-15
SEO網(wǎng)站跳出率、PV值達(dá)到多少才算及格
SEO工作者提高網(wǎng)站的排名是必要的,但是大家只知道提升排名,對于跳出率、PV值大家有沒有考慮過呢,一起來看看下面這篇文章吧2016-10-26