Nginx location块中配置缓存策略本质是添加HTTP缓存头,通过expires或add_header Cache-Control实现;需按资源类型匹配location,注意匹配优先级,并验证响应头是否生效。

在 Nginx 的 location 块里加缓存策略,本质是给响应加 HTTP 缓存头,让浏览器或中间代理知道“要不要缓”“缓多久”“怎么校验”。不涉及 proxy_cache 时,只需用 expires 或 add_header Cache-Control 就能生效,配置轻量、见效快。
按资源类型匹配 location,再设缓存头
先用正则或前缀匹配到目标文件,再在该块内写缓存指令。注意 location 匹配有优先级:精确匹配(=)> 前缀最长匹配(^~)> 正则匹配(~ 或 ~*)。如果某个高优 location ^~ /static/ 已覆盖了路径,你后面写的 location ~ \.js$ 就不会触发——得把它挪进去或改用 if 判断(不推荐,仅应急)。
location ~* \.(jpg|png|gif|woff2|ttf)$ { expires 1y; add_header Cache-Control "public, immutable"; }location ~* \.(js|css)$ { expires 1h; add_header Cache-Control "public, max-age=3600"; }location ~* \.html$ { add_header Cache-Control "private, no-cache, must-revalidate"; }
用 expires 快速设置过期时间
expires 是最简方式,它自动设置 Expires 和 Cache-Control: max-age=xxx 两个头,兼容老浏览器。值为正数时默认带 public;设为 -1s 相当于 no-cache;epoch 表示立即过期。
-
expires 7d;→ 缓存 7 天 -
expires 2h;→ 缓存 2 小时 -
expires -1s;→ 每次请求都发条件验证(ETag/Last-Modified) -
expires epoch;→ 强制不缓存,适合登录页、支付页
用 add_header 精细控制 Cache-Control 行为
当需要区分 CDN、浏览器、代理是否可缓存,或启用 immutable 这类现代特性时,直接用 add_header Cache-Control 更灵活。注意:add_header 不会覆盖 expires,但 Cache-Control 在 HTTP/1.1 中优先级更高,实际以它为准。
-
public:允许 CDN、代理、浏览器都缓存 -
private:只允许用户浏览器缓存,CDN 不得存储 -
no-cache:可缓存,但每次用前必须向服务器验证(非禁用缓存) -
no-store:完全禁止任何地方缓存,敏感内容用 -
immutable:配合长期max-age使用,告诉浏览器“这资源绝不会变”,刷新也不重发请求
避免常见失效陷阱
缓存头没生效?大概率是 location 没真正匹配到请求路径。可用 curl -I http://your.site/style.css 查看响应头是否含 Cache-Control 或 Expires;再检查 Nginx 配置中是否有更高优先级的 location 拦截了请求。另外,add_header 在子请求(如 error_page 内部跳转)中默认不继承,需加 always 参数才强制输出:
add_header Cache-Control "no-cache" always;- 修改配置后务必运行
nginx -t测试语法,再systemctl reload nginx生效 - 静态资源建议用
immutable + long max-age,HTML 页面建议用no-cache或短max-age+must-revalidate


















