瀏覽器HTTP緩存機制

来源:https://www.cnblogs.com/rennaiqian/archive/2018/01/23/8338041.html
-Advertisement-
Play Games

介紹HTTP緩存之前先簡單說一下Web緩存 Web緩存是一種保存Web資源副本併在下次請求時直接使用該副本的技術。        Web緩存可以分為這幾種:瀏覽器緩存、CDN緩存、伺服器緩存、資料庫數據緩存 。因為可能會直接使用副 ...


介紹HTTP緩存之前先簡單說一下Web緩存

Web緩存是一種保存Web資源副本併在下次請求時直接使用該副本的技術。

       Web緩存可以分為這幾種:瀏覽器緩存、CDN緩存、伺服器緩存、資料庫數據緩存 。因為可能會直接使用副本免於重新發送請求或者僅僅確認資源沒變無需重新傳輸資源實體,Web緩存可以減少延遲加快網頁打開速度、重覆利用資源減少網路帶寬消耗、降低請求次數或者減少傳輸內容從而減輕伺服器壓力。

       這篇文章主要討論和前端密切相關的瀏覽器HTTP緩存機制。瀏覽器HTTP緩存可以分為強緩存協商緩存強緩存協商緩存最大也是最根本的區別是:強緩存命中的話不會發請求到伺服器(比如chrome中的200 from memory cache),協商緩存一定會發請求到伺服器,通過資源的請求首部欄位驗證資源是否命中協商緩存,如果協商緩存命中,伺服器會將這個請求返回,但是不會返回這個資源的實體,而是通知客戶端可以從緩存中載入這個資源(304 not modified)。
強緩存與協商緩存

瀏覽器HTTP緩存由HTTP報文的首部欄位決定

報文結構

控制強緩存的欄位按優先順序介紹
  1. Pragma
           Pragma是HTTP/1.1之前版本遺留的通用首部欄位,僅作為於HTTP/1.0的向後相容而使用。雖然它是一個通用首部,但是它在響應報文中時的行為沒有規範,依賴於瀏覽器的實現。RFC中該欄位只有no-cache一個可選值,會通知瀏覽器不直接使用緩存,要求向伺服器發請求校驗新鮮度。因為它優先順序最高,當存在時一定不會命中強緩存。

  2. Cache-Control
           Cache-Control是一個通用首部欄位,也是HTTP/1.1控制瀏覽器緩存的主流欄位。和瀏覽器緩存相關的是如下幾個響應指令:

指令 參數 說明
private 表明響應只能被單個用戶緩存,不能作為共用緩存(即代理伺服器不能緩存它)
public 可省略 表明響應可以被任何對象(包括:發送請求的客戶端,代理伺服器,等等)緩存
no-cache 可省略 緩存前必需確認其有效性
no-store 不緩存請求或響應的任何內容
max-age=[s] 必需 響應的最大值
  • max-age(單位為s)設置緩存的存在時間,相對於發送請求的時間。只有響應報文首部設置Cache-Control為非0的max-age或者設置了大於請求日期的Expires(下文會講)才有可能命中強緩存。當滿足這個條件,同時響應報文首部中Cache-Control不存在no-cacheno-store且請求報文首部不存在Pragma欄位,才會真正命中強緩存。以下所有圖片均為刷新(command+R)的截圖。

響應報文首部no-cache和max-age同時存在
響應報文首部no-store和max-age同時存在
請求報文首部Pragma,響應報文首部max-age

  • no-cache 表示請求必須先與伺服器確認緩存的有效性,如果有效才能使用緩存(協商緩存),無論是響應報文首部還是請求報文首部出現這個欄位均一定不會命中強緩存。Chrome硬性重新載入(Command+shift+R)會在請求的首部加上Pragma:no-cacheCache-Control:no-cache
  • no-store 表示禁止瀏覽器以及所有中間緩存存儲任何版本的返迴響應,一定不會出現強緩存和協商緩存,適合個人隱私數據或者經濟類數據。
  • public 表明響應可以被瀏覽器、CDN等等緩存。
  • private 響應只作為私有的緩存,不能被CDN等緩存。如果要求HTTP認證,響應會自動設置為private
  1. Expires
           Expires是一個響應首部欄位,它指定了一個日期/時間,在這個時間/日期之前,HTTP緩存被認為是有效的。無效的日期比如0,表示這個資源已經過期了。如果同時設置了Cache-Control響應首部欄位的max-age,則Expires會被忽略。它也是HTTP/1.1之前版本遺留的通用首部欄位,僅作為於HTTP/1.0的向後相容而使用。
控制協商緩存的欄位
  1. Last-Modified/If-Modified-Since
           If-Modified-Since是一個請求首部欄位,並且只能用在GET或者HEAD請求中。Last-Modified是一個響應首部欄位,包含伺服器認定的資源作出修改的日期及時間。當帶著If-Modified-Since頭訪問伺服器請求資源時,伺服器會檢查Last-Modified,如果Last-Modified的時間早於或等於If-Modified-Since則會返回一個不帶主體的304響應,否則將重新返回資源。

    If-Modified-Since:

  2. ETag/If-None-Match
           ETag是一個響應首部欄位,它是根據實體內容生成的一段hash字元串,標識資源的狀態,由服務端產生。If-None-Match是一個條件式的請求首部。如果請求資源時在請求首部加上這個欄位,值為之前伺服器端返回的資源上的ETag,則當且僅當伺服器上沒有任何資源的ETag屬性值與這個首部中列出的時候,伺服器才會返回帶有所請求資源實體的200響應,否則伺服器會返回不帶實體的304響應。ETag優先順序比Last-Modified高,同時存在時會以ETag為準。

    If-None-Match:

ETag與If-None-Match

ETag屬性之間的比較採用的是弱比較演算法,即兩個文件除了每個比特都相同外,內容一致也可以認為是相同的。例如,如果兩個頁面僅僅在頁腳的生成時間有所不同,就可以認為二者是相同的。

因為ETag的特性,所以相較於Last-Modified有一些優勢:

    1.  某些情況下伺服器無法獲取資源的最後修改時間
    2.  資源的最後修改時間變了但是內容沒變,使用ETag可以正確緩存
    3.  如果資源修改非常頻繁,在秒以下的時間進行修改,Last-Modified只能精確到秒

整體流程

整體流程

求贊,歡迎訪問我的博客


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先上效果圖 灑豆子的效果,突發奇想,覺得這個動畫挺有意思的,就抽空寫了一個玩玩 繪製流程: 定義6個‘’豆子‘’,每個豆子有各自的屬性,大小,拋出的速度等,然後控制每個的方向和狀態,回彈效果使用差值器 BounceInterpolator package com.fragmentapp.view.b ...
  • 本文中我們將講解一下App的長連接實現。一般而言長連接已經是App的標配了,推送功能的實現基礎就是長連接,當然了我們也可以通過輪訓操作實現推送功能,但是輪訓一般及時性比較差,而且網路消耗與電量銷毀比較多,因此一般推送功能都是通過長連接實現的。 那麼如何實現長連接呢?現在一般有這麼幾種實現方式: 使用 ...
  • Genymotion是一款非常好用的虛擬機,利用它可以在window、Liunx或MAC系統上實現Android的模似器。對於開發人員來說,有了Android模似器,就可以在電腦上實時調試安卓app,而不用外接手機設置,非常方便。 現在我們開始安裝一個試下。 1.保證CPU是否支持虛擬化技術。 我們 ...
  • 最近發現css遺忘了很多,原因在於平時很少用到一些樣式,現記錄一些平時工作中使用頻率比較少的屬性以備查看。 1.文本屬性 首行文本縮進,針對於塊級元素,text-indent 可以使用所有長度單位,包括百分比值。百分比是相對於父級元素設置的。 文本對齊屬性值中有個justify是兩端對齊,之前用的比 ...
  • 簡介 前面寫了一篇文章講解了position常用的幾個屬性:《CSS 屬性之 position講解》一般都知道下麵幾個常用的: 在https://developer.mozilla.org/zh-CN/docs/Web/CSS/position還說了下麵這三個值: 估計大部分都沒有用過positio ...
  • 1:字元串 JS中的任何數據類型都可以當作對象來看。所以string既是基本數據類型,又是對象。 2:聲明字元串 var sStr = ‘字元串’; var oStr = new String(‘字元串’); 3:字元串屬性 1.length 計算字元串的長度(不區分中英文)。 2.construc ...
  • 模塊載入過程: 路徑分析 文件定位 模塊編譯 Node對引入過的模塊都會進行緩存,以減少二次引入時的開銷。緩存的是編譯和執行之後的對象。require時對緩存中的模塊是第一優先順序的 路徑分析 模塊標識符:require的參數,按書寫形式可以分成以下幾類: 核心模塊:如http,fs,path 文件模 ...
  • 轉載請註明出處: "Generator函數非同步應用" 上一篇文章詳細的介紹了Generator函數的語法,這篇文章來說一下如何使用Generator函數來實現非同步編程。 或許用Generator函數來實現非同步會很少見,因為ECMAScript 2016的async函數對Generator函數的流程式控制 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...