如何将缓存存到客户端浏览器上呢

要将缓存存到客户端浏览器,关键是让 浏览器接收到合适的 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;然后点击编辑路径&…