nginx中需在精准匹配静态资源的location块中用expires指令设置缓存,配合root/alias确保文件直出,并补全cache-control头;动态内容须禁用强缓存。

直接在 location 块中用 expires 指令就能延长静态资源的浏览器缓存时间,关键不是加时间数值本身,而是让这个指令精准作用在真正由 Nginx 直接响应的静态文件上。
匹配要缓存的静态资源类型
不能笼统地对整个站点或 HTML 路径设缓存,否则会把页面也锁住。推荐用大小写不敏感的正则匹配常见后缀:
location ~* \.(js|css|png|jpg|jpeg|gif|webp|ico|svg|woff2?|ttf|eot)$- 避免写成
location /static/后再靠后端返回文件——那样expires不生效 - 确保该
location的优先级高于更宽泛的规则(比如location /),否则会被覆盖
设置合理的缓存时长
时间值要结合资源是否带版本标识来定,不是越长越好:
- 带哈希名的 JS/CSS(如
app.a1b2c3.js):用expires 1y;或expires max; - 图片、字体等变动少的资源:用
expires 30d;或expires 6m; - 未做指纹处理的通用图片(如
logo.png):建议expires 1h;~expires 1d; - HTML、PHP 等动态内容:必须禁用强缓存,用
expires -1s;或expires epoch;
补全 Cache-Control 头提升兼容性
expires 会自动加 Expires 和 max-age,但现代浏览器更依赖 Cache-Control。建议显式补充:
- 对带哈希的资源:
add_header Cache-Control "public, immutable"; - 对普通图片:
add_header Cache-Control "public, max-age=2592000"; - 注意:同一作用域内多次
add_header会覆盖,只写一条
确认 Nginx 能正确读取文件
expires 生效的前提是请求确实由 Nginx 返回文件内容,而不是转发给后端:
- 确保
location块里有root或alias指向真实文件路径 - 例如:
root /var/www/html;,请求/style.css就会读取/var/www/html/style.css - 如果静态资源放在子目录(如
/images/),而 URL 是/img/logo.png,就得用alias或调整root配合 URI 重写











