nginx缓存策略需按资源类型精准配置:静态哈希资源用immutable设一年强缓存;普通静态资源设30天有效期;html用no-cache触发协商验证;动态接口必须no-store禁用所有缓存。

配置 Nginx 响应头缓存标识,核心是让浏览器和中间代理明确知道“这个资源能不能缓、能缓多久、要不要验证”。关键不在于堆砌指令,而在于按资源类型精准区分策略——静态资源讲实效,HTML 讲新鲜,动态接口讲禁用。
静态资源:用哈希名 + immutable 实现长期强缓存
对于构建后带内容哈希的文件(如 app.8a3f2b1e.js 或 style.d4c7e902.css),文件名变化即代表内容更新,可放心设为一年强缓存:
- 匹配规则建议用正则识别哈希段,例如
location ~* \.[a-f0-9]{6,}\.(css|js|png|jpg|woff2)$ - 设置
add_header Cache-Control "public, max-age=31536000, immutable" always; -
always参数确保即使返回 3xx 或 4xx 状态也生效,避免被忽略 - 无需再设
Expires,Cache-Control优先级更高且更可靠
普通静态资源:设合理有效期,兼顾更新与复用
未加哈希的图片、字体或第三方库(如 jquery.min.js),更新不可控,缓存时间宜保守:
- 匹配扩展名即可:
location ~* \.(gif|png|jpg|jpeg|webp|svg|woff|ttf|eot)$ - 推荐
expires 30d;或add_header Cache-Control "public, max-age=2592000"; - 避免使用
immutable,这类资源可能被手动覆盖但文件名不变 - 若 CDN 参与分发,
public允许其协同缓存;内网服务可改用private
HTML 与动态入口:禁强缓存,启协商验证
HTML 是应用入口,每次部署都可能变更。不能靠时间过期,而要靠服务器实时校验:
- 对
.html文件(尤其是/index.html)设no-cache,不是“不缓存”,而是“用前必须验证” - 写法示例:
add_header Cache-Control "private, no-cache, must-revalidate" always; - 依赖 Nginx 默认提供的
ETag或Last-Modified头,浏览器会自动带上If-None-Match或If-Modified-Since - 后端未修改时返回
304 Not Modified,节省全部响应体传输
敏感/动态内容:显式禁止缓存
用户数据、登录态接口、表单提交页等,必须杜绝任何形式的缓存:
- 对
/api/、/user/、/checkout等路径,统一设no-store - 示例:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; -
no-store比no-cache更严格:连临时磁盘缓存都不允许,适用于含隐私或金融类响应 - 避免仅靠
max-age=0,它仍可能触发协商缓存;no-store是唯一真正清零的方案











