Nginx静态资源缓存需在精准匹配的location块中配置expires和add_header Cache-Control:按后缀正则或前缀路径匹配,区分带哈希与无哈希资源设不同过期时间,并确保响应头真实生效。

核心是在匹配静态资源的 location 块中用 expires 指令设置响应头,同时配合 add_header Cache-Control 明确语义,确保浏览器按预期缓存。
按文件类型精准匹配 location
不能在全局或 location / 里统一加缓存,否则会误伤 HTML、API 等动态内容。推荐两种方式:
- 用正则匹配常见后缀:
location ~* \.(js|css|png|jpg|gif|woff2|svg|ico|webp)$ - 若静态资源集中放在固定路径(如
/static/),优先用前缀匹配:location ^~ /static/,性能更高、更安全
为不同资源设合理过期时长
缓存时间取决于文件是否带哈希指纹(如 main.a1b2c3.js)。没哈希的资源更新后 URL 不变,必须缩短缓存时间以防用户看到旧内容:
- 带哈希的 JS/CSS/字体/WebP:
expires 1y;或expires max; - 图片、图标等稳定但无哈希的资源:
expires 30d; - 未版本化的通用资源(如
logo.png):expires 1h;~expires 1d; - HTML、PHP、JSON 等动态内容:
expires epoch;并配no-cache
必须显式声明 Cache-Control 头
expires 只生成基础头,现代浏览器更依赖 Cache-Control,且需语义清晰、不被覆盖:
- 对带哈希资源:
add_header Cache-Control "public, immutable, max-age=31536000"; - 对普通图片:
add_header Cache-Control "public, max-age=2592000"; - 注意:
add_header同一作用域内多次写会覆盖,务必合并成一条
确保配置真正生效
写了不等于起效,关键检查点:
- 确认
root或alias指向真实静态文件路径,否则 404 导致响应头根本不会发出 - 运行
nginx -t验证语法,再nginx -s reload重载 - 用
curl -I https://your.site/style.css查看响应头,确认同时存在Cache-Control和Expires - 若没生效,排查是否 location 未命中、是否被上游(如反向代理)覆盖


















