HTTP狀態碼 304 頁面未修改


功能:304頁面未修改

自從上次請求后,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容。
如果網頁自請求者上次請求后再也沒有更改過,您應將服務器配置為返回此響應(稱為 If-Modified-Since HTTP 標頭)。服務器可以告訴 Googlebot 自從上次抓取后網頁沒有變更,進而節省帶寬和開銷。

當你在 Response-Header 中加上這幾項:

    Last-Modified: Wed, 18 Jun 2008 14:22:27 GMT
    Cache-Control: max-age=600
    Expires: Wed, 18 Jun 2008 14:48:39 GMT
    Date: Wed, 18 Jun 2008 14:38:39 GMT

其中 Last-Modified 后面的日期是上次更新 config 的時間,Date 后面是當前時間,Expires 后面是當前時間 + 10分鍾,10分鍾就是 Cache-Control 后面的 max-age,單位是秒。

Last-Modified

    如果客戶端收到的 Response 中包含 Last-Modified,那么下次 request 的時候就會在 Request Header 中包含 If-Modified-Since 字段,值就是上次服務器發送的 Last-Modified,服務器端會判斷上次的 config 時間是否比 If-Modified-Since 晚。如果自上次 request 之后又更新了 config,那么服務器就會返回完整的內容;如果期間沒有更新 config,那么服務器就沒必要返回完整的內容,只需要向客戶端發送一個 304 Not Modified 狀態碼就可以了。

Cache-Control、Date 和 Expires

    這幾個參數的組合,表示告訴瀏覽器:這個文件在多長時間之內不會更改,在這個時間內不需要再 request,保守起見,我設置了10分鍾。

瀏覽器行為

    如果只是在網站的鏈接之間 click click click,那么瀏覽器會完全遵守上述行為。這樣可以盡可能地減少請求次數,以及 response 的數據量。

如果在某個頁面點擊了瀏覽器的刷新按鈕或者按 F5,瀏覽器會忽略 Expires 時間,把該頁面需要的所有的文件都重新請求一遍。

如果按住 Ctrl 再刷新或者 Ctrl-F5 (俗稱強制刷新),瀏覽器將不會發送 Last-Modified Header,將所有需要的文件請求一遍,服務器會返回文件的完整內容,而不是僅僅一個 304 Not Modified 狀態碼。

http code 304基礎

1) 什么是”Last-Modified”?

    在瀏覽器第一次請求某一個URL時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個Last-Modified的屬性標記此文件在服務期端最后被修改的時間,格式類似這樣:

Last-Modified: Fri, 12 May 2006 18:53:33 GMT

客戶端第二次請求此URL時,根據 HTTP 協議的規定,瀏覽器會向服務器傳送 If-Modified-Since 報頭,詢問該時間之后文件是否有被修改過:

If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT


    如果服務器端的資源沒有變化,則自動返回 HTTP 304 (Not Changed.)狀態碼,內容為空,這樣就節省了傳輸數據量。當服務器端代碼發生改變或者重啟服務器時,則重新發出資源,返回和第一次請求時類似。從而保證不向客戶端重復發出資源,也保證當服務器有變化時,客戶端能夠得到最新的資源。

2) 什么是”Etag”?

    HTTP 協議規格說明定義ETag為“被請求變量的實體值” (參見 —— 章節 14.19)。另一種說法是,ETag是一個可以與Web資源關聯的記號(token)。典型的Web資源可以一個Web頁,但也可能是JSON或XML文檔。服務器單獨負責判斷記號是什么及其含義,並在HTTP響應頭中將其傳送到客戶端,以下是服務器端返回的格式:

ETag: "50b1c1d4f775c61:df3"

客戶端的查詢更新格式是這樣的:

If-None-Match: W/"50b1c1d4f775c61:df3"

如果ETag沒改變,則返回狀態304然后不返回,這也和Last-Modified一樣。本人測試Etag主要在斷點下載時比較有用。

Last-Modified和Etags如何幫助提高性能?

聰明的開發者會把Last-Modified 和ETags請求的http報頭一起使用,這樣可利用客戶端(例如瀏覽器)的緩存。因為服務器首先產生 Last-Modified/Etag標記,服務器可在稍后使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該記號傳回服務器要求服務器驗證其(客戶端)緩存。
過程如下:
1> 客戶端請求一個頁面(A)。
2> 服務器返回頁面A,並在給A加上一個Last-Modified/ETag。
3> 客戶端展現該頁面,並將頁面連同Last-Modified/ETag一起緩存。
4> 客戶再次請求頁面A,並將上次請求時服務器返回的Last-Modified/ETag一起傳遞給服務器。
5> 服務器檢查該Last-Modified或ETag,並判斷出該頁面自上次客戶端請求之后還未被修改,直接返回響應304和一個空的響應體。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM