nginx缓存响应头标准按资源类型与更新确定性决策:构建产物(带哈希名)用immutable+max-age=31536000;普通静态资源设max-age=2592000;html强制协商验证;api等敏感路径用no-store禁用全部缓存。

团队开发中统一 Nginx 缓存响应头标准,核心是把“资源类型”和“更新确定性”作为决策依据,而不是凭经验或拍脑袋设一个 max-age=3600。规范的重点不是写多少行配置,而是让每个成员一眼看懂:这个文件能不能缓、缓多久、要不要验证、谁有权改。
按资源指纹决定是否启用强缓存
构建产物带哈希名(如 app.7a2b1c.js、style.e8f9d0.css)的资源,内容变更必导致文件名变更——这是强缓存的前提。这类资源必须用 immutable 标记:
- 匹配规则统一用正则:
location ~* \.[a-f0-9]{6,}\.(js|css|png|jpg|webp|woff2)$ - 响应头固定为:
add_header Cache-Control "public, max-age=31536000, immutable" always; - 禁止在该 location 中出现
expires或其他Cache-Control覆盖指令
普通静态资源设保守有效期
未参与构建流程、无法保证文件名随内容变化的资源(如运营上传的 banner.jpg、第三方字体 font.woff、手动维护的 favicon.ico),一律视为“可能被覆盖但不改名”。这类资源不能加 immutable,缓存时间也需克制:
- 匹配扩展名即可:
location ~* \.(gif|png|jpg|jpeg|webp|svg|woff|ttf|eot|ico)$ - 统一设为 30 天:
add_header Cache-Control "public, max-age=2592000" always; - 若属内网管理后台等非公开场景,可改为
private替代public
HTML 和动态入口禁用强缓存,强制协商验证
.html 文件是前端应用的单点入口,部署即变更。它不能靠时间过期,而必须每次触发服务端校验:
- 所有
.html请求(包括/、/index.html、/about.html)必须落在同一 location 块中 - 响应头固定为:
add_header Cache-Control "no-cache, must-revalidate" always; - 确保后端或 Nginx 自身生成
ETag或Last-Modified(Nginx 默认开启,无需额外配置) - 严禁出现
max-age=0或no-store——前者仍可能走协商,后者浪费验证机会
API 与敏感路径显式禁用全部缓存
含用户态、表单提交、数据修改、登录态判断的路径(如 /api/、/user/、/login、/checkout),必须杜绝任何形式的缓存:
- 路径匹配建议用前缀:
location ^~ /api/ { ... }或location ^~ /user/ { ... } - 响应头统一为:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; - 不依赖
max-age=0单独生效,no-store是唯一能阻止浏览器写磁盘缓存的指令 - 若该路径下存在少数只读接口(如
/api/config),应单独拆出 location 并明确启用缓存,而非放宽整个前缀











