Nginx通过正则location精准控制静态资源缓存,对图片、字体等设1年缓存并加immutable,HTML禁用缓存;需注意^~优先级高于正则,应嵌套配置或改用root;配合Cache-Control、ETag等头部及curl验证生效。

整站静态化缓存加速,核心是让浏览器和中间代理(如 CDN)尽可能复用已下载的资源,减少重复请求。Nginx 本身不生成静态页面,但可以通过 location 规则精准控制各类静态资源的缓存行为——这是最常用、最轻量、也最有效的“伪静态缓存加速”方式。
按文件类型匹配并设置缓存时间
使用正则 location ~* 匹配常见静态后缀,统一设置过期策略:
location ~* \.(jpg|jpeg|png|gif|ico|webp|svg|avif)$ { expires 1y; add_header Cache-Control "public, immutable"; }location ~* \.(css|js|woff2?|ttf|eot|otf|font.css)$ { expires 1y; add_header Cache-Control "public, immutable"; }-
location ~* \.(html|htm)$ { add_header Cache-Control "no-cache, no-store, must-revalidate"; }—— HTML 文件通常不缓存,或仅缓存极短时间(如expires 10m;),避免版本更新后用户看不到新内容
注意 location 匹配优先级,避免被覆盖
如果站点同时用了 alias 或 ^~ 前缀的 location(比如 location ^~/static/),它会**优先于所有正则 location** 匹配。这意味着你写的 location ~* \.js$ 在 ^~/static/ 内部不会生效。
解决办法有两个:
- 把缓存规则写进高优先级 location 块内部,例如:
location ^~/static/ { alias /var/www/static/; location ~* \.(js|css|png)$ { expires 1y; } } - 改用
root+ 路径拼接的方式,让正则 location 能自然命中,更简洁可控
补充关键头部,提升缓存可靠性
单靠 expires 不够,需配合 Cache-Control 和可选的 ETag 控制:
-
add_header Cache-Control "public, immutable":适用于内容哈希命名的资源(如app.a1b2c3.js),告诉浏览器“这个文件永远不会变”,可安全长期缓存 - 对频繁更新的小文件(如未哈希的
main.css),改用"public, max-age=3600"并保留ETag,支持协商缓存(304) - 若明确禁用 ETag(比如为简化响应头),可加
etag off;或add_header ETag "";
验证是否生效
配置保存后,先 nginx -t 检查语法,再 systemctl reload nginx。用 curl 测试响应头:
curl -I https://yoursite.com/style.css
应看到类似:
Cache-Control: public, immutable
Expires: Wed, 07 Oct 2027 12:27:00 GMT
若没出现,检查 location 是否被更高优先级规则拦截,或路径是否实际命中(比如文件不在 root 指定目录下)。


















