功能: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的屬性標記此文件在服務期端最后被修改的時間,格式類似這樣:
客戶端第二次請求此URL時,根據 HTTP 協議的規定,瀏覽器會向服務器傳送 If-Modified-Since 報頭,詢問該時間之后文件是否有被修改過:
如果服務器端的資源沒有變化,則自動返回 HTTP 304 (Not Changed.)狀態碼,內容為空,這樣就節省了傳輸數據量。當服務器端代碼發生改變或者重啟服務器時,則重新發出資源,返回和第一次請求時類似。從而保證不向客戶端重復發出資源,也保證當服務器有變化時,客戶端能夠得到最新的資源。
2) 什么是”Etag”?
HTTP 協議規格說明定義ETag為“被請求變量的實體值” (參見 —— 章節 14.19)。另一種說法是,ETag是一個可以與Web資源關聯的記號(token)。典型的Web資源可以一個Web頁,但也可能是JSON或XML文檔。服務器單獨負責判斷記號是什么及其含義,並在HTTP響應頭中將其傳送到客戶端,以下是服務器端返回的格式:
客戶端的查詢更新格式是這樣的:
如果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和一個空的響應體。