1. 程式人生 > 程式設計 >基於HTTP瀏覽器快取機制全面解析

基於HTTP瀏覽器快取機制全面解析

目錄
  • 什麼是瀏覽器快取
  • 非HTTP協議定義的快取機制
  • 快取流程圖
  • HTTP快取機制
  • 服務端如何判斷快取已失效
    • Last-Modified/If-Modified-Since
    • Etag/If-None-Match
  • 為什麼有了Last-Modified還要Etag?
    • 200 OK(from cache)與304 Not Modified的區別
      • 200 OK( from cache ) 出現操作:
      • 304 Not Modified 出現操作:
    • 快取的不同來源
      • 不能被快取的請求

        什麼是瀏覽器快取

        Web快取是指一個Web資源(如html頁面,圖片,,資料等)存在於Web伺服器和客戶端(瀏覽器)之間的副本。快取會根據進來的請求儲存輸出內容的副本;當下一個請求來到的時候,如果是相同的URL,快取會根據快取機制決定是直接使用副本響應訪問請求,還是向源伺服器再次傳送請求。

        比較常見的就是瀏覽器會快取訪問過的,當再次訪問這個URL地址的時候,如果網頁沒有更新,就不會再次下載網頁,而是直接使用本地快取的網頁。

        只有當網站明確標識資源已經更新,瀏覽器才會再次下載網頁。瀏覽器和網站伺服器是根據快取機制進行快取的

        非HTTP協議定義的快取機制

        瀏覽器快取機制,其實主要就是HTTP協議定義的快取機制(如: Expires; Cache-control等)。但是也有非HTTP協議定義的快取機制,如使用HTML Meta 標籤,Web開發者可以在HTML頁面的節點中加入標籤

        <meta http-equiv="Pragma" content="no-cache">

        上述程式碼的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需要去伺服器拉取。使用上很簡單,但只有部分瀏覽器可以支援,yBKEpvCh而且所有快取代理伺服器都不支援,因為代理不解析HTML內容本身。

        快取流程圖

        利用瀏覽器快取的過程:

        在這裡插入圖片描述

        HTTP快取機制

        根據Response Header裡面的Cache-Control和Expires這兩個屬性,當兩個都存在時,Cache-Control優先順序較高。

        Cache-Control

        在這裡插入圖片描述

        該欄位用於控制瀏覽器在什麼情況下直接使用本地快取而不向伺服器傳送請求。一般具有以下值:

        • Public:指示響應可被任何快取區快取。
        • Private
          :指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當用戶的部分響應訊息,此響應訊息對於其他使用者的請求無效。
        • no-cache:指示請求或響應訊息不能快取。
        • no-store:用於防止重要的資訊被無意的釋出。在請求訊息中傳送將使得請求和響應訊息都不使用快取。
        • max-age:指示瀏覽器可以接收生存期不大於指定時間(以秒為單位)的響應。
        • min-fresh:指示瀏覽器可以接收響應時間小於當前時間加上指定時間的響應。
        • max-stale:指示瀏覽器可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼瀏覽器可以接收超出超時期指定值之內的響應訊息。

        Expires(石器時代的快取機制)

        Expires 頭部欄位提供一個日期和時間,在該日期前的所有對該資源的請求都會直接使用瀏覽器快取而不用向伺服器請求。

        例如:Expires: Sun,08 Nov 2009 03:37:26 GMT

        注意:

        • cache-control max-age 和 max-stale將覆蓋Expires header。
        • 使用Expires存在伺服器端時間和瀏覽器時間不一致的問題。
        • 另外有人說Expires 是HTTP 1.0的東西,現在預設瀏覽器均預設使用HTTP 1.1。

        服務端如何判斷快取已失效

        服務端通過If-Modified-Since(Last-Modified)和If-None-Match(Etag)這兩個屬性的值來判斷快取是否失效的。

        Last-Modified/If-Modified-Since

        Last-Modified/If-Modified-Since要配合Cache-Control使用。

        Last-Modified:響應資源的最後修改時間。

        If-Modified-Since:當快取過期時,發現資源具有Last-Modified宣告,則在請求頭帶上If-Modified-Since(值就是Last-Modified)。伺服器收到請求後發現有頭If-Modified-Since則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應HTTP 200整片資源內容(寫在響應訊息包體內);若最後修改時間較舊,說明資源無新修改,則響應HTTP 304,告知瀏覽器繼續使用所儲存的cache。

        Etag/If-None-Match

        Etag/If-None-Match也要配合Cache-Control使用。

        Etag:資源在伺服器的唯一標識(生成規則由伺服器決定)。Apache中,ETag的值,預設是對檔案的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後得到的。

        If-None-Match:當快取過期時,發現資源具有Etage宣告,則在請求頭帶上If-None-Match(值就是Etag)。伺服器收到請求後發現有頭If-None-Match 則與被請求資源的相應校驗串進行比對,決定返回200或304。

        為什麼有了Last-Modified還要Etag?

        Etag的出現主要是為了解決幾個Last-Modified比較難解決的問題:

        • Last-Modified標註的最後修改只能精確到秒級,如果某些檔案在1秒鐘以內,被修改多次的話,它將不能準確標註檔案的修改時間。
        • 如果某些檔案會被定期生成,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致檔案沒法使用快取。
        • 有可能存在伺服器沒有準確獲取檔案修改時間,或者與代理伺服器時間不一致等情形。

        200 OK(from cache)與304 Not Modified的區別

        200 OK( from cache )不向伺服器傳送請求,直接使用本地快取檔案。304 Not Modified則向伺服器詢問,若伺服器認為瀏覽器的快取版本還可用,那麼便會返回304。

        200 OK( from cache ) 出現操作:

        1.位址列回車

        2.頁面連結跳轉

        3.前進、後退

        304 Not Modified 出現操作:

        1.F5重新整理

        2.新開視窗

        快取的不同來源

        from disk cache:從磁碟中獲取快取資源,等待下次訪問時不需要重新下載資源,而直接從磁碟中獲取。它的直接操作物件為CurlCacheManager。

        from memory cache:從記憶體中獲取資源,等待下次訪問時不需要重新下載資源,而直接從記憶體中獲取。

        兩者區別:當退出程序時,記憶體中的資料會被清空,而磁碟的資料不會,所以,當下次再進入該程序時,該程序仍可以從diskCache中獲得資料,而memoryCache則不行。

        不能被快取的請求

        當然並不是所有請求都能被快取。

        無法被瀏覽yBKEpvCh器快取的請求:

        • HTTP資訊頭中包含Cache-Control:no-cache,pragma:no-cache(HTTP1.0),或Cache-Control:max-age=0等告訴瀏覽器不用快取的請求
        • http://www.cppcns.com
        • 需要根據Cookie,認證資訊等決定輸入內容的動態請求是不能被快取的
        • 經過HTTPS安全加密的請求
        • POST請求無法被快取
        • HTTP響應頭中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的請求無法被快取

        以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。