nginx按资源类型配置缓存策略需区分静态与动态内容:指纹化静态资源设1年不可变缓存,通用静态资源设7天缓存,html及动态内容禁用强缓存并保留etag验证。

在 Nginx 中按资源类型配置缓存策略,核心是区分静态资源与动态内容,并通过 location 块匹配文件后缀或路径,再用 add_header Cache-Control 精确控制响应头。不推荐混用 expires 和 add_header,后者优先级更高、语义更明确。
对指纹化静态资源设长期缓存
适用于构建产物中含哈希值的文件(如 app.abc123.js、style.f456.css、logo-789.png),这类资源内容不变,可安全缓存一年且标记为不可变:
- 用正则精准匹配带哈希特征的路径或文件名,例如:
location ~* "\.[a-f0-9]{8,}\.(js|css|png|jpg|svg|woff2)$" - 添加响应头:
add_header Cache-Control "public, max-age=31536000, immutable" always; -
always参数确保即使返回 304 或错误状态也生效
对通用静态资源设中期缓存
包括未加哈希的图标、字体、第三方 JS/CSS、常规图片等,更新频率较低但不如指纹文件可靠:
- 匹配常见扩展名:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2|ttf|eot)$ - 设置缓存时间 7 天:
add_header Cache-Control "public, max-age=604800"; - 避免使用
immutable,因文件内容可能被覆盖而 URL 不变
对 HTML 和动态内容禁用强缓存
HTML 是页面入口,常随版本更新;API 响应通常含用户态数据,必须实时或验证后使用:
- HTML 文件建议用:
add_header Cache-Control "private, no-cache, must-revalidate, max-age=0"; - PHP、JSON 接口等可统一匹配:
location ~* \.(html|htm|php|json)$ - 保留 ETag / Last-Modified,让浏览器发起条件请求(If-None-Match),服务端返回 304 节省带宽
注意 location 匹配优先级避免策略失效
如果存在 location ^~ /static/ 这类前缀匹配,它会终止后续正则匹配,导致缓存头不生效:
- 把缓存配置写进高优先级的
location内部,而不是依赖外部正则块 - 或改用
map指令在http块中按$request_uri或$sent_http_content_type动态生成缓存时间变量,再在location中引用 - 测试时可用
curl -I查看响应头是否包含预期的Cache-Control











