1. 程式人生 > >304 Not Modified詳解

304 Not Modified詳解

第一次訪問 200 

滑鼠點選二次訪問 (Cache) 

按F5重新整理 304 

按Ctrl+F5強制重新整理 200

        在客戶端向服務端傳送http請求時,若返回狀態碼為304 Not Modified 則表明此次請求為條件請求。在請求頭中有兩個請求引數:If-Modified-Since 和 If-None-Match。

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

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

        另一種情況是,如果伺服器認為客戶端快取的資源已經過期了,那麼伺服器就會返回HTTP/200 OK響應,響應體就是該資源當前最新的內容.客戶端收到200響應後,就會用新的響應體覆蓋掉舊的快取資源.只有在客戶端快取了對應資源且該資源的響應頭中包含了Last-Modified或ETag的情況下,才可能傳送條件請求.如果這兩個頭都不存在,則必須無條件(unconditionally)請求該資源,伺服器也就必須返回完整的資源資料.另外,有時候我們瀏覽器除錯的時候不希望本地快取,可以設定取消快取即可。

        如果選中了no cache,則請求資源時,請求頭中的Cache-Control為no-cache,表明不使用快取,則會直接獲取伺服器資源。另外,若沒選中no cache,Cache-Control有二種情況:

       1、max-age>0 時直接從遊覽器快取中提取 

       2、max-age<=0 時向伺服器傳送http請求,該資源是否有修改有的話返回200 ,無的話返回304.