1. 程式人生 > >網路---關於HTTP 304狀態碼的理解

網路---關於HTTP 304狀態碼的理解

有時候我們使用七牛過程中會遇到對瀏覽器快取下請求資源返回304的情況流量的計費的情況,這裡就需要了解HTTP 304的響應狀態的資源更新機制。

首先看一個關於304請求的響應頭的資訊,這裡面有兩個比較重要的請求頭欄位:If-Modified-SinceIf-None-Match,這兩個欄位表示傳送的是一個條件請求。
這裡寫圖片描述

當客戶端快取了目標資源但不確定該快取資源是否是最新版本的時候, 就會發送一個條件請求,這樣就可以辨別出一個請求是否是條件請求,在進行條件請求時,客戶端會提供給伺服器一個If-Modified-Since請求頭,其值為伺服器上次返回的Last-Modified響應頭中的Date日期值,還會提供一個If-None-Match請求頭,值為伺服器上次返回的ETag響應頭的值。
這裡寫圖片描述


伺服器會讀取到這兩個請求頭中的值,判斷出客戶端快取的資源是否是最新的,如果是的話,伺服器就會返回HTTP/304 Not Modified響應頭, 但沒有響應體.客戶端收到304響應後,就會從本地快取中讀取對應的資源.
所以:當訪問七牛資源出現304訪問的情況下其實就是先在本地快取了訪問的資源,然後請求的時候流量其實就是cdn返回的響應頭的位元組數的流量。

這裡以Chrome為例說一下快取資源在本地的儲存的位置,通過在Chrome瀏覽器的位址列輸入Chrome:Version檢視Chrome瀏覽器儲存檔案的位置:
這裡寫圖片描述

另一種情況是,如果伺服器認為客戶端快取的資源已經過期了,那麼伺服器就會返回HTTP/200 OK響應,響應體就是該資源當前最新的內容.客戶端收到200響應後,就會用新的響應體覆蓋掉舊的快取資源.

只有在客戶端快取了對應資源且該資源的響應頭中包含了Last-Modified或ETag的情況下,才可能傳送條件請求.如果這兩個頭都不存在,則必須無條件(unconditionally)請求該資源,伺服器也就必須返回完整的資源資料.

另外,有時候我們瀏覽器除錯的時候不希望本地快取,可以設定取消快取即可:
這裡寫圖片描述