一、什麼是304
先看一下304解釋:
更詳細一點,我們可以這麼理解:
1、如果客戶端在請求乙個檔案的時候,發現自己快取的檔案有 last modified ,那麼在請求中會包含 if modified since ,這個時間就是快取檔案的 last modified 。因此,如果請求中包含 if modified since,就說明已經有快取在客戶端。只要判斷這個時間和當前請求的檔案的修改時間就可以確定是返回 304 還是 200 。
3、對於動態頁面,就是動態產生的頁面,往往沒有包含 last modified 資訊,這樣瀏覽器、閘道器等都不會做快取,也就是在每次請求的時候都完成乙個 200 的請求。因此,對於動態頁面做快取加速,首先要在 response 的 http header 中增加 last modified 定義,其次根據 request 中的 if modified since 和被請求內容的更新時間來返回 200 或者 304 。雖然在返回 304 的時候已經做了一次資料庫查詢,但是可以避免接下來更多的資料庫查詢,並且沒有返回頁面內容而只是乙個 http header,從而大大的降低頻寬的消耗,對於使用者的感覺也是提高。
二、last-modified
1、在瀏覽器第一次請求某乙個url時,伺服器端的返回狀態會是200,內容是你請求的資源,同時有乙個last-modified的屬性標記此檔案在服務期端最後被修改的時間,格式類似這樣:
last-modified: fri, 12 may 2006 18:53
:33gmt
2、客戶端第二次請求此url時,根據 http 協議的規定,瀏覽器會向伺服器傳送 if-modified-since 報頭,詢問該時間之後檔案是否有被修改過:
if
-modified
-since: fri, 12 may 2006
18:53:33 gmt
伺服器端的程式先取得這個欄位的值,然後與伺服器上的資料最後修改時間對比,如果伺服器端的資源沒有變化,就直接返回 304 not modified 狀態碼,然後停止。這樣就節省了傳輸資料量,達到節省頻寬的目的。當伺服器端**發生改變或者重啟伺服器時,則重新發出資源,返回和第一次請求時類似。從而保證不向客戶端重**出資源,也保證當伺服器有變化時,客戶端能夠得到最新的資源。具體見下圖:
三、為什麼要使用條件請求
當使用者訪問乙個網頁時,條件請求可以加速網頁的開啟時間(因為可以省去傳輸整個響應體的時間),但仍然會有網路延遲,因為瀏覽器還是得為每個資源生成一條條件請求,並且等到伺服器返回http/304響應,才能讀取快取來顯示網頁.更理想的情況是,伺服器在響應上指定cache-control或expires指令,這樣客戶端就能知道該資源的可用時間為多長,也就能跳過條件請求的步驟,直接使用快取中的資源了.
可是,即使伺服器提供了這些資訊,在下列情況下仍然需要使用條件請求:
在超過伺服器指定的過期時間之後
如果使用者執行了重新整理操作的話
四、ctrl-f5會無條件的請求頁面中的每個資源如果使用者按下了ctrl-f5 (有時稱之為「強刷-hard refresh」),你會發現瀏覽器省略了if-modified-since和if-none-match請求頭,也就是無條件的請求頁面中的每個資源.
整理來自:
理解HTTP 304響應
剛剛開始使用fiddler的使用者經常會對fiddler的網路會話 web sessions 列表中的http 304響應感到困惑 如果客戶端傳送的是乙個條件驗證 conditional validation 請求,則web伺服器可能會返回http 304響應,這就表明了客戶端中所請求資源的快取仍然...
理解HTTP 304響應
原文 剛剛開始使用fiddler的使用者經常會對fiddler的網路會話 web sessions 列表中的http 304響應感到困惑 如果客戶端傳送的是乙個條件驗證 conditional validation 請求,則web伺服器可能會返回http 304響應,這就表明了客戶端中所請求資源的快...
譯 理解HTTP 304響應
原文 剛剛開始使用fiddler的使用者經常會對fiddler的網路會話 web sessions 列表中的http 304響應感到困惑 如果客戶端傳送的是乙個條件驗證 conditional validation 請求,則web伺服器可能會返回http 304響應,這就表明了客戶端中所請求資源的快...