最近和同事一起看Web的Cache問題,又進一步理解了 HTTP 中的 304 又有了一些瞭解。 304 的標準解釋是:
Not Modified 用戶端有緩衝的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。伺服器告訴客戶,原來緩衝的文檔還可以繼續使用。
如果用戶端在請求一個檔案的時候,發現自己緩衝的檔案有 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,從而大大的降低頻寬的消耗,對於使用者的感覺也是提高。
當這些緩衝有效時候,通過 HttpWatch 查看一個請求會得到這樣的結果:
第一次訪問 200
滑鼠點擊二次訪問 (Cache)
按F5重新整理 304
按Ctrl+F5強制重新整理 200
如果是這樣的就說明緩衝真正有效了。以上就是我對 HTTP 304 的一個理解。
本文出處:http://bulaoge.net/topic.blg?dmn=webdev&tid=301677