最常用稳妥做法是按后缀正则匹配并分类设置:带哈希的js/css/字体等用expires 1y和add_header cache-control "public, immutable, max-age=31536000";普通图片用expires 30d和"public, max-age=2592000";html等动态资源用expires -1和"no-cache, must-revalidate, max-age=0"。

直接在 location 块中用正则匹配后缀,配合 expires 指令和 add_header Cache-Control 设置强缓存,是最常用也最稳妥的做法。关键不是统一设长时效,而是按文件是否带哈希、更新频率和业务节奏分类处理。
JS/CSS/字体/WebP 等带哈希的静态资源
这类文件名含版本标识(如 app.a1b2c3.js),内容变更即改名,适合设最长强缓存并启用 immutable,避免重复校验。
location ~* \.(js|css|woff2?|ttf|eot|svg|webp)$ { expires 1y; add_header Cache-Control "public, immutable, max-age=31536000"; }-
immutable告诉浏览器:只要 URL 不变,内容就一定没变,跳过If-None-Match和If-Modified-Since请求 - 注意不要把
.html或接口路径误包含进来,否则会缓存不该缓存的内容
普通图片(jpg/png/gif 等)
运营图、Banner 图等内容可能频繁更新但文件名不变,不宜设 1 年;30 天兼顾 CDN 分发效率与人工更新灵活性。
location ~* \.(jpg|jpeg|png|gif|bmp|ico)$ { expires 30d; add_header Cache-Control "public, max-age=2592000"; }- 如果某类图片更稳定(比如用户头像),可单独再写一个
location设更长时效 - 避免用
location /images/这种路径前缀统配——若目录里混了 HTML 或 JSON,就会被错误缓存
HTML/PHP/XML 等动态或入口页
这些文件通常无哈希、内容常变、且是用户访问第一入口,必须禁用强缓存,强制每次向服务端确认最新版本。
location ~* \.(html|htm|php|xml|json)$ { expires -1; add_header Cache-Control "no-cache, must-revalidate, max-age=0"; }-
expires -1会让 Nginx 返回Expires: Thu, 01 Jan 1970 00:00:01 GMT,等效于禁止强缓存 - 仍保留协商缓存能力(支持 304),比
no-store更合理,不增加带宽但保证实时性
验证配置是否生效
改完配置别急着 reload,先检查响应头是否正确输出:
- 用
curl -I https://your.site/app.css查看是否有Cache-Control和Expires头 - 确保没有更高优先级的
location(比如location /)覆盖了你的规则 - 注意正则匹配大小写:
~*表示忽略大小写,~则区分,生产环境推荐统一用~*











