瀏覽器緩存小結

原文鏈接:瀏覽器緩存

瀏覽器緩存

強緩存 & 協商緩存

  • 強緩存
    釋義: 客戶端第一次問服務器要某個資源時,服務器丟還給客戶端所請求的這個資源同時,告訴客戶端將這個資源保存在本地,並且在未來的某個時點之前如果還需要這個資源,直接從本地獲取就行了,不用向服務器請求.這種方式緩存下來的資源稱爲強緩存.

    Expires & Cache-Control:max-age

    • Expires:
      該字段是http1.0時的規範,值爲一個絕對時間的GMT格式的時間字符串,代表緩存資源的過期時間,在這個時點之前,即命中緩存.
    • Cache-Control:
      該字段是http1.0時的規範,值爲一個絕對時間的GMT格式的時間字符串,代表緩存資源的過期時間,在這個時點之前,即命中緩存.
      參數:
      no-cache: 如果請求頭部包含no-cache指令,表示客戶端不接收緩存過的響應.中間緩存服務器必須將請求轉發給給源服務器. 瀏覽器強制刷新(window下ctrl+F5)就是這個原理,所以的請求都設置no-cache
      no-store: 暗示請求和響應包含機密信息,不能進行緩存.
      區分: no-store纔是真正的不緩存
      max-age: 該指令用來標識緩存資源的最大有效期. 如果max-age=0,就會向源服務器發送請求進行緩存資源新鮮度的驗證.瀏覽器普通刷新F5

      cache-directive 作爲請求首部時,cache-directive 的可選值有:

      字段名稱 說明
      no-cache 告知(代理)服務器不直接使用緩存,要求向原服務器發起請求.
      no-store 所有內容都不會保存到緩存或者Internet臨時文件中.
      max-age=delta-seconds 告知 (代理)服務器,客戶端希望接收一個存在時間不大於detal-seconds秒的資源.
      max-stale[=delta-seconds 告知 (代理)服務器,客戶端願意接收一個超過緩存時間的資源,若有定義delta-seconds則爲delta-seconds,若沒有則爲任意超出的時間.
      min-fresh=delta-seconds 告知 (代理)服務器,客戶端希望接收一個在小於delta-seconds秒內被更新過的資源.
      no-transform 告知 (代理)服務器,客戶端希望獲取實體數據沒有被轉換(比如壓縮)過的資源.
      only-if-cached 告知 (代理)服務器,客戶端希望獲取換成的內容(若有),而不用向原來服務器請求.
      cache-extension 自定義擴展值,若服務器不識別改值則會被忽略.

      cache-directive 作爲響應首部時,cache-directive 的可選值有:

      字段名稱 說明
      public 表明任何情況下都得緩存該資源(即使是需要HTTP認證的資源).
      Private[="field-name"] 表明返回報文中全部或者部分(若指定field-name,則爲field-name的字段數據)僅開放給某些用戶(服務器指定的share-user,如代理服務器)做緩存使用,其他用戶則不能緩存這些數據.
      no-cache 不直接使用緩存,要向服務器發起(新鮮度校驗)請求.
      no-store 所有內容都不會保存到緩存或者Internet臨時文件中.
      no-transform 告知客戶端緩存文件時不得對實體數據做任何改變.
      only-if-cached 告知(代理)服務器,客戶端希望獲取緩存的內容(如果有),而不向原來服務器發起請求.
      must-revalidate 當前資源一定是向原服務器發起驗證請求的,若請求失敗會返回504(而非代理服務器上的緩存).
      proxy-revalidate 與must-revalidate類似,但僅能應用於共享緩存(如代理).
      max-age=delta-seconds 告知客戶端,該資源在delta-seconds秒內是新鮮的,無需向 服務器發起請求.
      s-max-age=delta-seconds 同max-age,但僅用於共享緩存(如代理).
      cache-extension 自定義擴展值,若服務器不識別改值則會被忽略.
      在請求頭中max-age=0與no-cache的區別?
         返回的狀態來看:no-cache都是200,而max-age可能是304(如果瀏覽器有緩存).  
         請求參數:max-age請求頭一般會攜帶If-Modified-Since或If-None-Match字段進行新鮮度驗證,而no-cache不會攜帶. F5刷新是max-age=0來實現,而強制刷新(Ctrl+F5)是通過no-cache實現.  
異同: Expires是HTTP 1.0+的首部,用來指定一個絕對的過期日期,依賴客戶端時間設置的準確性,緩存時間是相對服務器上的時間而言的.
max-age是HTTP/1.1的Cache-Control的一個字段,用來指定文檔的最大使用時間.
  • 協商緩存
    釋義: 客戶端第一次問服務器要某個資源時,服務器丟還給客戶端所請求的這個資源同時,將該資源的一些信息(文件摘要、或者最後修改時間)也返回給客戶端,告訴客戶端將這個資源緩存在本地.當客戶端下一次需要這個資源時,將請求以及相關信息(文件摘要、或者最後修改時間)一併發送給服務器,由服務器來判斷客戶端緩存的資源是否需要更新:如不需要更新,就直接告訴客戶端獲取本地緩存資源;如需要更新,則將最新的資源連同相應的信息一併返回給客戶端.

    Last-Modified & If-Modified-Since & Etag & If-None-Match

    • Last-Modidied & If-Modified-Since:

      • Last-Modified: 爲實體首部字段,值爲資源最後更新時間,隨服務器response返回.
      • If-Modified-Since: 爲請求首部字段,通過比較兩個時間來判斷資源在兩次請求期間是否有過修改,如果沒有修改,則命中協商緩存,瀏覽器從緩存中獲取資源;如果有過修改,則服務器返回資源,同時返回新的Last-Modified時間.
    • Etag & If-None-Match:

      • Etag: 爲相應頭部字段,表示資源內容的唯一標識,隨服務器response返回.
      • If-None-Match: 爲請求頭部字段,服務器通過比較請求頭部的If-None-Match與當前資源的ETag是否一致來判斷資源是否在兩次請求之間有過修改,如果沒有修改,則命中協商緩存,瀏覽器從緩存中獲取資源;如果有過修改,則服務器返回資源,同時返回新的ETag.
  • 不能緩存的請求

    1. HTTP信息頭中包含Cache-Control:no-cache,pragma:no-cache(HTTP1.0),或Cache-Control:max-age=0等告訴瀏覽器不用緩存的請求. Cache-Control: no-cache:這個很容易讓人產生誤解,使人誤以爲是響應不被緩存.實際上Cache-Control: no-cache是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應數據時,緩存都要向服務器評估緩存響應的有效性.
    2. 需要根據Cookie,認證信息等決定輸入內容的動態請求是不能被緩存的.
    3. 經過HTTPS安全加密的請求.
    4. POST請求無法被緩存.
    5. HTTP響應頭中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的請求無法被緩存.
  • 瀏覽器緩存機制示意圖

瀏覽器緩存機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章