Nginx 中不同域名可独立配置缓存策略,需在各自 server 块内设置 expires 指令并配合 add_header 精确控制 Cache-Control,优先级遵循 location > server > http 的作用域规则。

在 Nginx 中,不同域名(虚拟主机)可以拥有各自独立的缓存策略,包括 expires 指令。关键在于将 expires 放置在对应的 server 块内,而非全局或 upstream 中——这样就能实现基于域名的差异化缓存控制。
每个 server 块单独配置 expires
最直接有效的方式是在每个 server 配置块中显式设置 expires,它会覆盖更上层(如 http 或 location)的同名指令。例如:
- 网站 A(www.example.com)需要强缓存:静态资源缓存 1 年
- 网站 B(api.example.com)禁止浏览器缓存:返回
Cache-Control: no-cache
对应配置片段如下:
server {
listen 80;
server_name www.example.com;
root /var/www/example;
<pre class="brush:php;toolbar:false;">location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}}
server { listen 80; server_name api.example.com; root /var/www/api;
location / {
# 禁用浏览器缓存,但不干扰后端逻辑
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
proxy_pass http://backend_api;
}}
注意 location 与 server 的作用域优先级
expires 指令遵循 Nginx 配置继承规则:越靠近请求匹配位置的配置优先级越高。这意味着:
- 若在
http块中设置了expires 1h,但某个server块里没写,该 server 会继承这个值 - 若该
server块中写了expires 1d,则以server块为准 - 若某
location内又写了expires epoch,则该 location 下的响应将强制不缓存
因此,要确保各域名策略互不干扰,推荐在每个 server 块的顶层或关键 location 中明确声明 expires,避免隐式继承带来偏差。
配合 add_header 精确控制 Cache-Control
expires 仅设置 Expires 响应头,现代浏览器更依赖 Cache-Control。建议搭配 add_header 使用,例如:
-
expires 1w;+add_header Cache-Control "public, max-age=604800"; -
expires off;表示不发送Expires头,此时完全由Cache-Control决定行为 - 注意:
add_header在 location 中多次出现时,只会保留最后一个;如需多值,合并写入单条指令
验证与调试技巧
部署后可通过 curl 快速检查响应头是否生效:
curl -I https://www.example.com/style.css curl -I https://api.example.com/v1/status
重点关注以下字段:
-
Expires:对应expires设置的时间戳(GMT) -
Cache-Control:是否包含预期的max-age、no-cache等指令 -
Age:若经过代理,可判断是否命中上游缓存
如果发现未生效,常见原因包括:配置未重载(nginx -s reload)、语法错误导致该 server 块未加载、或被更高优先级 location 覆盖。

















