1、http狀態碼304的理解html
一、若是客戶端在請求一個文件的時候,發現本身緩存的文件有 Last Modified ,那麼在請求中會包含 If Modified Since ,這個時間就是緩存文件的 Last Modified 。所以,若是請求中包含 If Modified Since,就說明已經有緩存在客戶端。只要判斷這個時間和當前請求的文件的修改時間就能夠肯定是返回 304 仍是 200 。數據庫
二、對於靜態文件,例如:CSS、圖片,服務器會自動完成 Last Modified 和 If Modified Since 的比較,完成緩存或者更新。瀏覽器
三、對於動態頁面,就是動態產生的頁面,每每沒有包含 Last Modified 信息,這樣瀏覽器、網關等都不會作緩存,也就是在每次請求的時候都完成一個 200 的請求。所以,對於動態頁面作緩存加速,首先要在 Response 的 HTTP Header 中增長 Last Modified 定義,其次根據 Request 中的 If Modified Since 和被請求內容的更新時間來返回 200 或者 304 。雖然在返回 304 的時候已經作了一次數據庫查詢,可是能夠避免接下來更多的數據庫查詢,而且沒有返回頁面內容而只是一個 HTTP Header,從而大大的下降帶寬的消耗,對於用戶的感受也是提升。 緩存
2、什麼是」Last-Modified」?服務器
一、在瀏覽器第一次請求某一個URL時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個Last-Modified的屬性標記此文件在服務期端最後被修改的時間,格式相似這樣:網絡
Last-Modified: Fri, 12 May 2006 18:53:33 GMTspa
二、客戶端第二次請求此URL時,根據 HTTP 協議的規定,瀏覽器會向服務器傳送 If-Modified-Since 報頭,詢問該時間以後文件是否有被修改過:htm
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT圖片
服務器端的程序先取得這個字段的值,而後與服務器上的數據最後修改時間對比,若是服務器端的資源沒有變化,就直接返回 304 Not Modified 狀態碼,而後中止。這樣就節省了傳輸數據量,達到節省帶寬的目的。當服務器端代碼發生改變或者重啓服務器時,則從新發出資源,返回和第一次請求時相似。從而保證不向客戶端重複發出資源,也保證當服務器有變化時,客戶端可以獲得最新的資源。資源
3、爲何要使用條件請求
當用戶訪問一個網頁時,條件請求能夠加速網頁的打開時間(由於能夠省去傳輸整個響應體的時間),但仍然會有網絡延遲,由於瀏覽器仍是得爲每一個資源生成一條條件請求,而且等到服務器返回HTTP/304響應,才能讀取緩存來顯示網頁.更理想的狀況是,服務器在響應上指定Cache-Control或Expires指令,這樣客戶端就能知道該資源的可用時間爲多長,也就能跳過條件請求的步驟,直接使用緩存中的資源了.
在下列狀況下仍然須要使用條件請求
一、在超過服務器指定的過時時間以後
二、若是用戶執行了刷新操做的話
參考資料: http狀態碼304 http://www.studyofnet.com/news/982.html