核心是在匹配静态资源的location块中用expires指令设置Cache-Control和Expires响应头,推荐location ~* .(css|js|png|jpg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; },需确保Nginx直接服务文件且路径正确。

在 nginx.conf 中配置静态文件缓存过期时间,核心是通过 expires 指令控制 HTTP 响应头中的 Cache-Control 和 Expires,让浏览器知道该资源能缓存多久。关键不在于全局设置,而是在匹配静态资源的 location 块中针对性配置。
匹配常见静态文件后缀
通常把 .css、.js、.png、.jpg、.woff2 等资源统一归到一个 location 块里,用正则或前缀匹配:
- 推荐用
location ~* \.(css|js|png|jpg|gif|ico|woff|woff2|ttf|eot|svg)$,~*表示忽略大小写的正则匹配 - 避免写成
location /static/后再靠后端返回静态文件——那样无法生效 expires,必须由 Nginx 直接服务文件(即有root或alias)
设置缓存时长(推荐方式)
在匹配静态资源的 location 块内添加 expires 指令,例如:
-
expires 1y;→ 发送Cache-Control: max-age=31536000和Expires时间戳(1年后) -
expires 7d;→ 缓存 7 天(max-age=604800) -
expires epoch;→ 禁用缓存(Expires: Thu, 01 Jan 1970 00:00:01 GMT) -
expires off;→ 不发送Expires和Cache-Control头(完全交由上游或浏览器默认行为)
配合 etag 和 if-modified-since(可选增强)
Nginx 默认开启 etag 和 if_modified_since,无需额外配置。但需确保:
– 静态文件磁盘内容未被频繁覆盖(否则 inode 或 mtime 变更会触发 200 而非 304)
– 不要同时启用 sendfile on 和 gzip on 对同一响应做多次处理(极少见冲突,但调试缓存时可临时关闭 gzip 观察)
完整 location 示例
以下是一个典型配置片段(放在 server 块内):
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /var/www/myapp;
expires 1y;
add_header Cache-Control "public, immutable";
}
immutable 是现代浏览器支持的提示,告诉浏览器该资源在过期前绝不会变更,可跳过条件请求,提升性能。注意:仅适用于带哈希指纹的文件(如 main.a1b2c3.js),普通文件慎用。


















