一、强缓存(Strong Cache)
1. 定义
• 强缓存直接告诉浏览器:在缓存过期前,无需与服务器通信,直接使用本地缓存。
• 由服务器通过响应头 Cache-Control
和 Expires
控制。
2. 响应头
• Cache-Control: max-age=3600
表示资源在 3600 秒(1小时) 内有效(优先级高于 Expires
)。
• Expires: Thu, 31 Dec 2030 23:59:59 GMT
指定一个绝对过期时间(依赖于客户端本地时间,可能存在误差)。
3. Nginx 配置示例
location /static/ {# 设置强缓存:1年内有效add_header Cache-Control "public, max-age=31536000";expires 1y;
}
4. 行为
• 浏览器首次请求资源时,服务器返回资源并附带缓存头。
• 后续请求时,浏览器直接读取本地缓存(状态码 200 (from disk cache)
),不发送请求到服务器。
5. 适用场景
• 静态资源(如 CSS、JS、图片、字体文件)等长期不变的资源。
二、协商缓存(协商缓存,Weak Cache)
1. 定义
• 协商缓存要求浏览器 每次向服务器验证缓存是否过期,若未过期则返回 304 Not Modified
,继续使用本地缓存。
• 由服务器通过响应头 Last-Modified
和 ETag
控制。
2. 响应头
• Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
表示资源最后修改时间(精度为秒,可能因时间同步问题失效)。
• ETag: "5d8c72a5-264"
资源的唯一标识符(哈希值或版本号),精度更高。
3. Nginx 配置示例
location /dynamic/ {# 启用协商缓存(默认已支持,无需显式配置)add_header Last-Modified "";etag on;
}
4. 行为
1、浏览器首次请求资源时,服务器返回资源并附带 Last-Modified
或 ETag
。
2、后续请求时,浏览器通过以下请求头验证缓存:
• If-Modified-Since: [Last-Modified值]
向服务器询问资源是否在指定时间后修改过。
• If-None-Match: [ETag值]
向服务器验证资源的 ETag
是否变化。
3、若资源未修改,服务器返回 304 Not Modified
,浏览器继续使用缓存;若已修改,返回新资源(状态码 200
)。
5. 适用场景
• 频繁更新的资源(如 HTML 页面、动态 API 响应)。
三、关键区别
四、Nginx 最佳实践
1、混合使用两种缓存
location / {# 强缓存 1 小时,过期后启用协商缓存add_header Cache-Control "public, max-age=3600";etag on;
}
2、按文件类型区分策略
# 图片、字体等强缓存
location ~* \.(jpg|png|gif|woff2)$ {expires 1y;add_header Cache-Control "public, max-age=31536000";
}# HTML 文件禁用强缓存(总是协商)
location ~* \.html$ {add_header Cache-Control "no-cache, must-revalidate";
}
3、解决缓存更新问题
• 强缓存资源建议通过 文件名哈希 控制版本(如 main.abcd1234.js
)。
• 协商缓存可通过修改 ETag
或 Last-Modified
触发更新。
五、调试工具
1、浏览器开发者工具(Network 标签):
• 查看 200 (from disk cache)
(强缓存)或 304 Not Modified
(协商缓存)。
• 检查请求头中的 Cache-Control
、If-Modified-Since
、If-None-Match
。
2、命令行工具:
curl -I http://example.com/resource.js
通过合理配置强缓存和协商缓存,可以显著提升网站性能,减少服务器负载。
文章转载自:dashery
原文链接:什么是nginx的强缓存和协商缓存 - dashery - 博客园
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构