如何將緩存存到客戶端瀏覽器上呢

要將緩存存到客戶端瀏覽器,關鍵是讓 瀏覽器接收到合適的 HTTP 緩存控制響應頭。這通常通過 add_header 添加控制頭來實現。

請添加圖片描述


? 一般做法(強緩存 + 協商緩存):

🔹 1. 強緩存:使用 Cache-ControlExpires

location /static/ {root /path/to/static/files;add_header Cache-Control "max-age=3600, public";add_header Expires $http_expires;
}
  • max-age=3600:緩存 3600 秒
  • public:任何緩存服務器或瀏覽器都可以緩存
  • Expires:指定絕對過期時間(可選)

🔹 2. 協商緩存:使用 ETagLast-Modified

如果你在服務靜態資源,比如:

location /static/ {root /path/to/static/files;etag on;if_modified_since exact;add_header Cache-Control "no-cache";
}
  • 瀏覽器下次訪問時會帶 If-None-MatchIf-Modified-Since,服務器可返回 304 Not Modified

🧠 如果你是用 OpenResty 返回的 Lua 內容:

你可以手動添加緩存相關頭部,例如:

ngx.header["Cache-Control"] = "max-age=60, public"
ngx.header["Expires"] = ngx.http_time(ngx.time() + 60)
ngx.say("hello world")

這樣瀏覽器會在 60 秒內使用本地緩存,不會再請求服務端


🧪 如何驗證瀏覽器緩存是否生效?

方法一:Chrome F12 → Network → 觀察響應頭

  • 狀態碼 200 + from memory cache 或 disk cache

  • 狀態碼 304 表示協商緩存命中

  • 響應頭中應有:

    • Cache-Control
    • Expires
    • ETag / Last-Modified(如開啟)

? 實戰建議

靜態資源使用強緩存:

location /assets/ {root /usr/share/nginx/html;add_header Cache-Control "max-age=31536000, public";
}

動態接口用協商緩存或短時間強緩存(配合版本號或參數):

location /api/data {content_by_lua_block {ngx.header["Cache-Control"] = "max-age=10"ngx.say("data at ", ngx.now())}
}

是不是看的云里霧里?我們來一步步詳細講解如何讓 OpenResty/Nginx 將數據緩存到瀏覽器端(客戶端),這樣客戶端再次訪問時就不必重復請求。


🎯 目標

讓瀏覽器緩存接口或靜態資源內容,避免每次都請求服務器,提高性能。


🧱 基礎概念先弄清楚

緩存類型控制方式瀏覽器行為
強緩存Cache-Control + Expires瀏覽器 不發請求,直接用本地緩存
協商緩存ETagLast-Modified瀏覽器 發請求,但服務器判斷內容未變,返回 304,無內容體

? 示例一:配置強緩存(適用于靜態資源)

location /static/ {root /Users/yourname/openresty-static;  # 靜態文件目錄add_header Cache-Control "public, max-age=3600";add_header Expires $http_expires;
}

解釋:

  • max-age=3600:緩存 3600 秒(1 小時)
  • public:允許任何緩存服務器(包括瀏覽器)緩存
  • Expires:兼容舊瀏覽器(用絕對時間)

🧪 測試方法

  1. 瀏覽器訪問一次 /static/test.js
  2. 再刷新,看 Network → test.js 狀態為 200 from memory/disk cache

? 示例二:動態接口設置緩存頭(Lua 模擬)

location /api/time {content_by_lua_block {ngx.header["Cache-Control"] = "public, max-age=30"ngx.header["Expires"] = ngx.http_time(ngx.time() + 30)ngx.say("server time: ", ngx.now())}
}

解釋:

  • 設置響應頭,告訴瀏覽器:30秒內請直接使用本地緩存
  • 瀏覽器不會向服務器請求這段時間內的 /api/time

🧪 測試方法

  1. 瀏覽器訪問 /api/time,記錄時間
  2. 再訪問一次,響應不變、Network 顯示 from memory cache,說明緩存生效

? 示例三:協商緩存(加上 ETag)

如果你服務靜態文件,可以這樣配置:

location /docs/ {root /Users/yourname/openresty-docs;etag on;if_modified_since exact;add_header Cache-Control "no-cache";
}

解釋:

  • etag on: Nginx 生成 ETag(唯一標識當前內容版本)
  • no-cache: 瀏覽器每次請求都會帶 If-None-Match,服務器返回 304 表示內容沒變

🧪 測試方法

  1. 第一次請求 /docs/intro.html → 返回 200
  2. 第二次請求瀏覽器自動帶上 If-None-Match → 返回 304 Not Modified

協商緩存(Conditional Requests)機制中,瀏覽器每次都會帶上 ETagLast-Modified 發起請求,以詢問服務器是否資源有更新。

🔁 協商緩存工作機制(以 ETag 為例)

第一次請求:

  1. 瀏覽器訪問 /example.js

  2. 服務器響應:

    200 OK
    ETag: "abc123"
    Cache-Control: no-cache
    

    瀏覽器會把這個 ETag 存起來。

第二次請求(瀏覽器再次訪問):

  1. 瀏覽器自動帶上頭部:

    If-None-Match: "abc123"
    
  2. 服務器比對資源的當前 ETag 與請求的 If-None-Match

    • 如果一樣 → 資源沒變,返回:

      304 Not Modified
      

      無內容體,瀏覽器用本地緩存展示。

    • 如果不一樣 → 資源已變,返回新的 200 和更新的內容與 ETag。

📦 注意:

  • 你必須顯式設置 Cache-Control: no-cache,表示 “每次請求都要驗證”
  • 如果你不設置,默認不會發起協商請求,可能只靠 max-age 強緩存

🚧 注意事項

  1. 接口不宜長期緩存,可以短時間緩存如 5~60 秒,用于頻繁請求但數據變化不快的情況。
  2. 靜態資源可以長期緩存,但要結合文件名加 hash,如 main.abcd1234.js
  3. 如果你用 Vue/React 構建的頁面,也可以通過 nginx.conf/dist 設置緩存頭

📦 常見 Cache-Control 組合參考

場景配置示例說明
瀏覽器強緩存Cache-Control: public, max-age=86400一天內直接使用本地緩存
協商緩存Cache-Control: no-cache + ETag每次請求,服務器可返回304
不緩存Cache-Control: no-store瀏覽器不保存任何內容
CDN 緩存,瀏覽器不緩存Cache-Control: public, max-age=86400, must-revalidate瀏覽器每次都向服務器確認

題外話:
CDN 緩存(Content Delivery Network 緩存)是指將網站的靜態資源(如圖片、JS、CSS、HTML等)緩存在離用戶更近的邊緣節點服務器上,以提升訪問速度、減輕源站壓力、提升系統可用性。


🧠 一句話理解:

CDN 緩存就是:

“讓用戶訪問 CDN 邊緣節點的緩存副本,而不是每次都去請求源站”。

? 需要注意的是邊緣節點是 CDN 服務商提供的,不是你自己買的服務器。

🧠 什么是邊緣節點?

邊緣節點(Edge Node)是 CDN 服務商在全國各地、甚至全球布置的緩存服務器。這些服務器靠近用戶,稱為“邊緣”。

比如你用了阿里云 CDN,當上海的用戶訪問你的網站時,請求不會直接打到你自己的源站服務器,而是訪問阿里云在上海部署的 CDN 節點

📦 誰提供這些邊緣節點?

你不需要自己買,常見 CDN 服務商都提供大量邊緣節點:

CDN 服務商邊緣節點說明
阿里云 CDN全國幾百個節點,支持全球覆蓋
騰訊云 CDN國內+海外分布式節點
百度云加速全國部署節點
七牛云 CDN國內主打圖床/加速
Cloudflare全球超過 300+ 城市節點
AWS CloudFront全球 CDN 服務,適合國際化
Fastly / Akamai國際大廠,專注北美和全球

🖼? 舉個例子幫助你理解

你的網站部署在北京阿里云的一臺服務器上,用戶可能來自全國各地:

用戶地理位置沒有 CDN有 CDN
北京快(直連)更快(邊緣節點)
廣州慢(跨區訪問)快(廣州本地 CDN 節點)
上海慢(跨區)快(上海本地節點)
美國非常慢(跨境)快(洛杉磯/SF 節點)

🛠? 如何使用這些邊緣節點?

  1. 你將資源部署在源站(比如你的服務器、對象存儲等)

  2. 你通過 CDN 服務商的加速域名對外訪問,比如:

    原地址:https://yourserver.com/logo.png
    CDN 加速地址:https://cdn.yourdomain.com/logo.png
    
  3. 用戶訪問的是 CDN 域名,CDN 會自動在邊緣節點緩存和分發。

💡 總結一句話:

CDN 的邊緣節點是 CDN 平臺提供的,分布在各地,你無需部署也無需購買,只要開通使用即可享受加速服務。


🗂? 緩存的內容類型

CDN 常緩存以下內容:

資源類型是否常緩存
圖片(.jpg/.png/.gif)?
JS/CSS/字體文件?
HTML 頁面(根據配置)?(需配置)
接口數據(JSON 等)?(需配置)
視頻/音頻資源?

🏗? CDN 緩存原理

  1. 用戶訪問資源(如 https://cdn.example.com/logo.png

  2. CDN 邊緣節點查找本地緩存:

    • ? 找到了(命中緩存):直接返回。
    • ? 沒有(未命中緩存):回源到源站,取回資源 → 緩存在邊緣節點 → 返回用戶。
  3. 下一次其他用戶訪問時就直接用緩存了。


🔐 緩存控制方式(CDN 依據這些控制)

CDN 判斷是否緩存/是否過期主要依賴:

響應頭說明
Cache-Control是否緩存、緩存多久(如 max-age=600
Expires指定過期時間(已被 Cache-Control 替代)
ETag/Last-Modified協商緩存用,做回源時判斷是否更新
Vary用于不同 User-Agent/語言生成不同緩存副本

👉 CDN 可以配置“強緩存”或“協商緩存”,也可結合自身規則(如 URL 后綴、參數名等)自定義策略。


🚀 CDN 緩存的好處

優勢描述
? 提升訪問速度用戶從就近節點獲取資源,降低延遲
🔁 降低源站壓力靜態內容不再頻繁請求源站
💥 提高抗壓能力多節點分發請求,防止高峰宕機
🌍 跨地域加速國內外訪問都能快

🔧 示例:設置緩存響應頭(Nginx)

location /static/ {root /var/www/html;expires 1h;  # 設置緩存1小時add_header Cache-Control "public";
}

? 小結

問題答案
CDN 緩存和本地緩存一樣嗎?類似,都是減少重復請求。但 CDN 是服務器層緩存
CDN 緩存在哪?緩存在 CDN 邊緣節點(距離用戶近的服務器)
什么時候會回源?緩存未命中,或者緩存過期時

📌 總結

  • 想讓客戶端緩存數據,關鍵是設置好 HTTP 響應頭
  • OpenResty 本身不自動幫你做瀏覽器緩存,你要顯式加 Cache-ControlExpiresETag 等頭
  • content_by_lua 里也能加 ngx.header[...] 發送這些頭部

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86217.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟ASR與開源模型分析

一、微軟ASR核心能力 1. 支持場景 場景功能實時語音轉文本低延遲流式識別(會議字幕/直播轉錄)音頻文件轉文本支持多種格式(WAV/MP3等),批量處理長音頻定制化模型針對特定行業術語(醫療/金融)訓…

2025下半年軟考中級科目難度解析與選科指南

2025年下半年軟考中級科目共有6科,包括系統集成項目管理工程師、信息系統管理工程師、信息安全工程師、網絡工程師、軟件設計師以及多媒體應用設計師。面對眾多科目,考生應如何做出選擇? 一、考試時間安排 在開始備考之前,了解考…

深度剖析:PPP PRIVATE NETWORK UDP/IP AGGLIGATOR

🚀 深度剖析:PPP PRIVATE NETWORK UDP/IP AGGLIGATOR 🏗? 一、架構概述 這是一個高性能網絡聚合系統,核心功能是通過多路TCP連接隧道化UDP流量,提升網絡傳輸的可靠性和性能。系統采用C編寫,基于Boost.Asi…

05-StarRocks功能使用FAQ

StarRocks功能使用FAQ 概述 本文檔整理了StarRocks功能使用過程中常見的問題和解決方案,涵蓋了表管理、分區、索引、物化視圖、外部表等核心功能的使用方法和最佳實踐。 表管理FAQ Q1: 如何創建和管理表? A: 表管理方法: 1. 創建表 -- 創建基本表 CREATE TABLE table…

ASP.NET Core API文檔與測試實戰指南

前言 在現代軟件開發中,API(應用程序編程接口)已成為不同服務和應用程序之間通信的橋梁。一個優秀的API不僅需要具備良好的功能性,更需要有完善的文檔和全面的測試策略。本文將深入探討ASP.NET Core環境下的API文檔生成與測試實踐…

域名 SSL證書和IP SSL證書有什么區別?

在互聯網安全領域,SSL證書扮演著至關重要的角色,它能夠有效保障數據傳輸的安全性,防止數據泄露和被篡改。而域名SSL證書與IP SSL證書作為兩種不同類型的SSL證書,各自有著獨特的特點和適用場景,本文國科云將對它們進行詳…

多個Vue項目共用一個node_modules依賴包,避免占用太大內存,window上創建微鏈接

最近突然發現電腦內存不夠了,沒辦法項目太多了,新加的項目也安裝不了依賴包,內存不夠了。 然后我最近發現個新東西,就是多個項目共用一個依賴包。 第一步: 可以創建一個空文件夾專門放依賴包,也可以直接用…

目標檢測新升級:用YOLOv8打造密度視頻熱力圖可視化

文章目錄 目標檢測新升級:用YOLOv8打造密度&視頻熱力圖可視化一、YOLOv8的改進(一)模型結構優化(二)注意力機制的引入 二、YOLOv8可視化熱力圖的原理與方法(一)熱力圖的基本概念&#xff08…

QT6 源(126)QModelIndex 模型索引:閱讀注釋與測試其成員函數,及其源代碼。以及 typedef QList<QModelIndex> QModelIndexList;

(1)模型里條目的索引是支持調試打印的 : (2)還結合上例的測試結果,給出本模型索引的定義,如下 : (3)繼續本模型索引類的成員函數的測試,還使用上面…

分布式環境下 Spring Boot 項目基于雪花算法的唯一 ID 生成方案

一、分布式系統 分布式系統是指將多個獨立的計算節點通過網絡連接,協同完成同一目標的系統架構。其核心特征是: 多個獨立節點:每個節點都是一個可獨立運行的服務實例網絡通信:節點間通過網絡協議(如HTTP、RPC&#x…

如何在 Chrome 瀏覽器中保存從商店下載的擴展程序到本地

如何在 Chrome 瀏覽器中保存從商店下載的擴展程序到本地 方法一:通過擴展程序頁面直接導出(適用于已安裝的擴展) 打開 Chrome 擴展管理頁面 在地址欄輸入:chrome://extensions/或通過菜單:? > 更多工具 > 擴展…

沒有VISA怎么注冊AWS?

沒有VISA怎么注冊AWS?跨境賣家、開發者與學生黨必看的“AWS賬號開通終極指南”! 在云計算日益普及的今天,Amazon Web Services(AWS)作為全球領先的云服務提供商,以其服務廣度、技術深度和生態系統成熟度&a…

華為服務器的選型指南

以下是華為服務器選型指南及推薦方案,綜合性能、場景適配與成本優化: 一、核心選型維度 業務場景 通用計算(Web/中間件):推薦通用型鯤鵬服務器(如KH系列),支持多核并發&#xff08…

Python-3-數據結構(字典)

1 字典 特點 1.鍵-值成對出現 “鍵:值 ” 2.鍵不能重復 3.鍵不可更改,值可以修改 4.鍵來索引值 5.鍵只能是不可變的數據類型 dic_Python{the define:1,the age:2,the clude:[A,B] } #增刪查改 dic_Python[the age] dic_Python[the define]77#賦值修改 di…

API訪問Token的概念及解析

API 訪問Token(API Access Token) 如大家所了解的,API訪問Token是用于第三方應用調用服務的關鍵措施,如支付接口、地圖 API等。 許多機構和安全指南(例如 OWASP API Security Project)建議采用短期 Token…

???????[AI 工具] Dify 免費 GPT 調用詳解:額度、付費與自托管方案全解

引言:Dify 是什么? Dify 是一個支持多種大模型(如 GPT-3.5、GPT-4、GPT-4o)的開源 AI 應用開發平臺,支持 Web UI 快速搭建、多模態能力、團隊協作等。其平臺免費開放使用 GPT 模型,受到開發者和技術社區廣泛關注。 我是Dify重度用戶,大多數情況用本地部署,但是忽然發…

構建你的API防護盾 - 抵御惡意爬蟲、注入與業務欺詐

現代App和Web應用的核心是API,它也是攻擊者的首要目標。惡意爬蟲竊取數據、SQL注入篡改數據庫、精心構造的請求進行薅羊毛或欺詐… 這些業務邏輯層的攻擊,往往能繞過傳統防火墻。本文將分享幾種實用的API防護技術,并提供可直接部署的代碼示例…

從 “人工巡檢” 到 “遠程智控”,工業路由器實現變電站遠程監控

能源電力行業加速數字化轉型,負責電力輸送與分配的變電站智能化升級迫在眉睫。工業路由器在變電站遠程監控領域成功應用,是能源電力物聯網建設必不可少的核心通訊設備。 變電站遠程監控項目背景 傳統變電站監控依賴人工巡檢與有線通信,效率低…

xss利用meta強制跳轉 CPS report-uri 報錯泄露利用 -- GPN CTF 2025 Free Parking Network 1 2

part 1 在此題目中,我們可以指定html與標頭 <sCrIpt>alert(1)</ScRipt>A5rz: A5rz服務器會返回如下內容 HTTP/1.1 200 OK X-Powered-By: Express A5rz: A5rz Content-Type: text/html; charsetutf-8 Content-Length: 619 ETag: W/"26b-14GnlOyaaXJ3CEkd0rBJ/m…

1 Web vue環境搭建

1 下載好node.js 用node -v和npm -v看是否環境配置好&#xff0c;看到如下結果就是配置好了 2 安裝vue腳手架 輸入這個代碼 npm i vue/cli -g 查看到如下&#xff0c;說明安裝成功 3 下載vue初始模板 輸入 vue ui 會打開一個網頁 點擊創建&#xff0c;然后點擊編輯路徑&…