1. 程式人生 > >HTTP的請求頭標籤 If-Modified-Since

HTTP的請求頭標籤 If-Modified-Since

一直以來沒有留意過HTTP請求頭的IMS(If-Modified-Since)標籤。

最近在分析Squid的access.log日誌檔案時,發現了一個現象。 就是即使是對同一個檔案進行HTTP請求,第一次和第二次產生的網路流量資料也是不一致的。

在調查的過程中,逐漸瞭解了HTTP的If-Modified-Since的頭標籤的作用。

大家都知道客戶端瀏覽器是有快取的,裡面存放之前訪問過的一些網頁檔案。 例如IE,會把快取檔案存到“C:\Documents and Settings\zh2000g\Local Settings\Temporary Internet Files” 這樣類似的目錄裡。 其實快取裡儲存的不只是網頁檔案,還有伺服器發過來的該檔案的最後伺服器修改時間。

If-Modified-Since是標準的HTTP請求頭標籤,在傳送HTTP請求時,把瀏覽器端快取頁面的最後修改時間一起發到伺服器去,伺服器會把這個時間與伺服器上實際檔案的最後修改時間進行比較。

如果時間一致,那麼返回HTTP狀態碼304(不返回檔案內容),客戶端接到之後,就直接把本地快取檔案顯示到瀏覽器中。

如果時間不一致,就返回HTTP狀態碼200和新的檔案內容,客戶端接到之後,會丟棄舊檔案,把新檔案快取起來,並顯示到瀏覽器中。

 下面用一個簡單的小例子說明一下。

由於演示例子需要擷取HTTP Request和Response的資訊,我在這裡使用的工具是Fiddler。 感興趣的朋友可以到【

http://www.fiddler2.com/Fiddler2/version.asp】去下載。

1.首先在伺服器建立一個簡單的HTML檔案,用瀏覽器訪問一下,成功表示HTML頁面。Fiddler就會產生下面的捕獲資訊。   需要留意的是   (1)因為是第一次訪問該頁面,客戶端發請求時,請求頭中沒有If-Modified-Since標籤。   (2)伺服器返回的HTTP狀態碼是200,併發送頁面的全部內容。   (3)伺服器返回的HTTP頭標籤中有Last-Modified,告訴客戶端頁面的最後修改時間。  

2.在瀏覽器中重新整理一下頁面,Fiddler就會產生下面的捕獲資訊。   需要注意的是   (1)客戶端發HTTP請求時,使用If-Modified-Since標籤,把上次伺服器告訴它的檔案最後修改時間返回到伺服器端了。   (2)因為檔案沒有改動過,所以伺服器返回的HTTP狀態碼是304,沒有傳送頁面的內容。

3.用文字編輯器稍微改動一下頁面檔案,儲存。再用瀏覽器訪問一下,Fiddler就會產生下面的捕獲資訊。

需要留意的是   (1)客戶端發HTTP請求時,使用If-Modified-Since標籤,把上次伺服器告訴它的檔案最後修改時間返回到伺服器端了。   (2)因為檔案被改動過,兩邊時間不一致,所以伺服器返回的HTTP狀態碼是200,併發送新頁面的全部內容。   (3)伺服器返回的HTTP頭標籤中有Last-Modified,告訴客戶端頁面的新的最後修改時間。

HTTP的If-Modified-Since頭標籤與客戶端快取相互配合,大大節約了網路流量。