nginx location中通过expires或add_header设置缓存响应头,可控制浏览器端缓存;expires自动设expires和cache-control,add_header支持精细控制如public/private/no-cache/immutable等策略。

在 Nginx 的 location 块里设置缓存控制头,核心是用 add_header 或 expires 指令,直接作用于匹配到的请求路径,控制浏览器或中间代理如何缓存响应。不需要启用 proxy_cache,仅靠响应头就能生效,适合静态资源、API 或页面级缓存策略。
区分两类缓存场景再配置
先明确你要解决的是哪类缓存:
-
浏览器端缓存(Client-side):让用户本地浏览器记住 CSS/JS/图片等,减少重复下载;用
expires或add_header Cache-Control即可。 -
反向代理缓存(Proxy-side):Nginx 自己缓存后端响应(比如 PHP 或上游 API 返回),需配合
proxy_cache系列指令;此时add_header只影响响应头,不决定 Nginx 是否真缓存。
本节聚焦前者——location 内纯响应头控制,最常用也最轻量。
用 expires 指令快速设过期时间
expires 是最简洁的方式,它自动设置 Expires 和 Cache-Control: max-age=xxx 两个头部,兼容性好。
-
expires 1h;→ 缓存 1 小时 -
expires 30d;→ 缓存 30 天(值为正数时,Cache-Control会带public) -
expires -1s;→ 等效于Cache-Control: no-cache,强制每次校验 -
expires epoch;→ 立即过期,适合登录页、动态内容
示例:对所有图片和字体文件启用一年强缓存
location ~* \.(jpg|jpeg|png|gif|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
用 add_header 精确控制 Cache-Control 行为
当需要更细粒度策略(比如禁止 CDN 缓存但允许浏览器缓存),就用 add_header Cache-Control 直接写值:
-
public:允许任何缓存(浏览器、CDN、代理)存储 -
private:只允许浏览器缓存,不可被共享缓存(如 CDN)存储 -
no-cache:可缓存,但每次使用前必须向服务器验证(发条件请求) -
no-store:完全禁止缓存,敏感页面适用 -
immutable:告诉浏览器资源不会变,即使刷新也不重发请求(需搭配长期max-age)
注意:add_header 不会覆盖 expires,两者共存时以 Cache-Control 为准(HTTP/1.1 规范优先级更高)。建议二者选其一,避免混淆。
常见组合与避坑点
实际配置中几个关键细节容易出错:
- 匹配顺序很重要:Nginx 按
location定义顺序或优先级匹配,确保静态资源规则写在通用location /之前 -
add_header在子请求中不继承:如果用了try_files或内部重定向,头部可能丢失,加always参数可强制输出(如add_header Cache-Control "no-cache" always;) - 不要对动态接口乱加 long-term 缓存:比如
location ~ \.php$配expires 1y会导致数据陈旧,应设no-cache或短时效 - HTML 页面通常设为
no-cache或must-revalidate,依赖 ETag/Last-Modified 实现协商缓存
示例:HTML 页面禁用强缓存,但允许协商验证
location ~ \.html$ {
add_header Cache-Control "private, no-cache, must-revalidate";
}











