一、强缓存(Strong Cache)
1.定义
• 强缓存直接告诉浏览器:在缓存过期前,无需与服务器通信,直接使用本地缓存。
• 由服务器通过响应头Cache-Control和Expires控制。
2.响应头
•Cache-Control: max-age=3600
表示资源在3600 秒(1小时)内有效(优先级高于Expires)。
•Expires: Thu, 31 Dec 2030 2359 GMT
指定一个绝对过期时间(依赖于客户端本地时间,可能存在误差)。
3.Nginx 配置示例
location/static/ { # 设置强缓存:1年内有效 add_headerCache-Control"public, max-age=31536000"; expires1y; }
4.行为
• 浏览器首次请求资源时,服务器返回资源并附带缓存头。
• 后续请求时,浏览器直接读取本地缓存(状态码200 (from disk cache)),不发送请求到服务器。
5.适用场景
• 静态资源(如 CSS、JS、图片、字体文件)等长期不变的资源。
二、协商缓存(协商缓存,Weak Cache)
1.定义
• 协商缓存要求浏览器每次向服务器验证缓存是否过期,若未过期则返回304 Not Modified,继续使用本地缓存。
• 由服务器通过响应头Last-Modified和ETag控制。
2.响应头
•Last-Modified: Wed, 21 Oct 2023 0700 GMT
表示资源最后修改时间(精度为秒,可能因时间同步问题失效)。
•ETag: "5d8c72a5-264"
资源的唯一标识符(哈希值或版本号),精度更高。
3.Nginx 配置示例
location/dynamic/ {
# 启用协商缓存(默认已支持,无需显式配置)
add_headerLast-Modified"";
etagon;
}
4.行为
浏览器首次请求资源时,服务器返回资源并附带Last-Modified或ETag。
后续请求时,浏览器通过以下请求头验证缓存:
•If-Modified-Since: [Last-Modified值]
向服务器询问资源是否在指定时间后修改过。
•If-None-Match: [ETag值]
向服务器验证资源的ETag是否变化。
若资源未修改,服务器返回304 Not Modified,浏览器继续使用缓存;若已修改,返回新资源(状态码200)。
5.适用场景
• 频繁更新的资源(如 HTML 页面、动态 API 响应)。
三、关键区别
| 特性 | 强缓存 | 协商缓存 |
|---|---|---|
| 通信成本 | 无网络请求(直接读缓存) | 需发送请求验证缓存 |
| 响应状态码 | 200 (from disk cache) | 304 Not Modified |
| 优先级 | 优先于协商缓存 | 强缓存过期后触发 |
| 适用资源 | 长期不变的静态资源 | 频繁更新的动态资源 |
四、Nginx 最佳实践
混合使用两种缓存
location/ {
# 强缓存 1 小时,过期后启用协商缓存
add_headerCache-Control"public, max-age=3600";
etagon;
}
按文件类型区分策略
# 图片、字体等强缓存
location~* .(jpg|png|gif|woff2)${
expires1y;
add_headerCache-Control"public, max-age=31536000";
}
# HTML 文件禁用强缓存(总是协商)
location~* .html${
add_headerCache-Control"no-cache, must-revalidate";
}
解决缓存更新问题
• 强缓存资源建议通过文件名哈希控制版本(如main.abcd1234.js)。
• 协商缓存可通过修改ETag或Last-Modified触发更新。
五、调试工具
浏览器开发者工具(Network 标签):
• 查看200 (from disk cache)(强缓存)或304 Not Modified(协商缓存)。
• 检查请求头中的Cache-Control、If-Modified-Since、If-None-Match。
命令行工具:
curl -I http://example.com/resource.js
通过合理配置强缓存和协商缓存,可以显著提升网站性能,减少服务器负载。
链接:https://www.cnblogs.com/ydswin/p/18757690
-
缓存
+关注
关注
1文章
248浏览量
27642 -
浏览器
+关注
关注
1文章
1042浏览量
36908 -
nginx
+关注
关注
0文章
180浏览量
12968
原文标题:什么是nginx的强缓存和协商缓存
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
详解浏览器的缓存机制
Mybatis缓存之一级缓存
一文知道Nginx服务器的缓存原理和机制
什么是Web缓存,HTTP缓存和浏览器缓存的区别
如何在SpringBoot中解决Redis的缓存穿透等问题
如何使用缓存
缓存之美——如何选择合适的本地缓存?

nginx中强缓存和协商缓存介绍
评论