我把关键点核对了一遍 - 91在线;关于缓存设置的说法,我试了三种方法才搞明白!真假自辨,我只摆事实点

前言
关于缓存,网上说法很多:有人说“把缓存关了才能实时看到改动”,有人说“全部都缓存,性能立刻提升”。两边都有道理,也都有坑。我把关键点一条条核对过,亲自用三种常见方案跑了对比测试,下面把结论、证据和实操步骤都摆清楚,帮助你少踩弯路。
先说明实验环境(方便你复现)
- 静态资源:CSS/JS/图片
- 动态页面:PHP 渲染的产品页
- 服务端:Nginx + PHP-FPM
- CDN:Cloudflare(免费计划)
- 本地测试工具:curl、浏览器 DevTools、Lighthouse
三种我亲测的方法
方法一:最保守——关闭或短缓存(开发阶段常用)
做法要点
- 响应头设置 Cache-Control: no-store 或 Cache-Control: no-cache, must-revalidate
- 静态资源和页面均短时间缓存(例如 max-age=0)
测试结果
- 优点:修改立刻可见,调试友好
- 缺点:重复访问性能差,带宽和延迟明显变高
适用场景
- 本地开发、频繁发布的调试期
方法二:验证型缓存——利用 ETag / Last-Modified 做条件请求
做法要点
- 服务端保留资源的 ETag 或 Last-Modified
- Cache-Control: public, max-age=0, must-revalidate(允许浏览器发条件请求)
测试结果
- 优点:首次下载完整资源,后续仅在资源变动时才传输数据(返回 304),节省带宽
- 缺点:服务器仍需处理条件请求,适合文件不经常变更但又希望保证最新内容的场景
适用场景
- 文档、较少改动的静态文件,以及对一致性有要求的页面
方法三:积极缓存 + 版本化(生产环境推荐)
做法要点
- 静态资源使用长期缓存:Cache-Control: public, max-age=31536000, immutable
- 资源文件名加入版本号/哈希(例如 app.abc123.js),每次内容变更生成新文件名
- 动态页面短缓存或使用 CDN 的边缘缓存并设置合适的刷新策略(如基于路径的缓存规则)
测试结果
- 优点:极大提升命中率,减少延迟和带宽;CDN 边缘缓存能把请求拉近用户
- 缺点:需要构建流程支持版本化与部署时的清理策略
适用场景
- 生产环境、静态资源量大、用户分布广的应用
如何验证自己设置是否生效(实用步骤)
- curl -I https://your.site/path 查看响应头(关注 Cache-Control、Expires、ETag、Last-Modified)
- 浏览器 DevTools → Network 看 Status(200 vs 304)及 Size(from disk cache / from memory cache)
- Lighthouse 或 WebPageTest 测试首屏性能与缓存命中率
- 从不同网络或地区(用 VPN 或 CDN 日志)验证边缘缓存命中情况
常见误区与真相
- 误区:把所有东西都设置长缓存就完事了。真相:动态内容必须能及时更新,版本化是关键,否则用户会看到旧内容。
- 误区:ETag 总是更好。真相:ETag 能避免大量下载,但在分布式部署或文件复制时,ETag 的一致性可能带来问题(建议结合 Last-Modified 或生成稳定的 ETag)。
- 误区:CDN 配置一次就万无一失。真相:CDN 的缓存策略和源站头部、缓存键(是否包含 Query String)紧密相关,需要按资源类型分规则。
配置示例(快速参考)
- Nginx(静态资源长期缓存)
location ~* .(js|css|png|jpg|jpeg|gif|svg)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
- Nginx(动态页面短缓存 + ETag 支持)
location / {
add_header Cache-Control "public, max-age=0, must-revalidate";
etag on;
}
- Cloudflare(规则建议)
- 静态路径(/static/*)设置 Edge Cache TTL 为 1 year,Origin Cache Control:Ignore
- 页面(/product/*)设置 Edge Cache TTL 为 1 hour 或基于 Cache-Control:Respect Existing Headers
我的实测结论(直接上结论)
- 开发期:用方法一,保证改动实时可见,开发效率最高。
- 上线前:用方法二做中间过渡,对变动不频繁但需一致性的资源很友好。
- 生产稳定期:用方法三为主。静态资源长期缓存 + 文件哈希版本化,动态页面结合短缓存或 CDN 边缘策略,能同时实现性能和可控性。
遇到问题别慌,先按顺序排查
1) 用 curl 查看 header,确认是否为你期望的缓存策略
2) 检查 CDN 是否覆盖了该 URL(有时路由或 Query String 导致不命中)
3) 确认构建流程是否正确地输出带哈希的文件名
4) 多服务器部署时注意时间同步(文件修改时间会影响 Last-Modified)
结尾(一句话建议)
生产站点把静态资源长期缓存并用版本号,动态页面用短缓存或边缘缓存,开发阶段就短缓存或关闭缓存——三种方法各取所长,合起来才稳。