nginx 中需在 location 块内配置页面缓存策略:用 = 精确匹配单页,^~ 前缀匹配路径,~ 正则匹配带参页面;须避免宽泛规则、注意优先级、配合 cache-control 头,并通过 curl 验证响应头。

在 Nginx 中,server 块本身不直接控制“特定页面”的缓存过期时间,真正起作用的是 location 块内的配置。但你可以通过精准的 location 匹配,在 server 块内为某类或某个具体页面(如 /about.html、/status)单独设置缓存策略。
用 location 精确匹配目标页面
不要依赖泛匹配,而是用明确路径或正则锁定目标:
-
精确匹配单个页面:用
=前缀确保唯一性,避免被其他 location 覆盖location = /about.html {<br> expires 1h;<br> add_header Cache-Control "public, max-age=3600";<br>} -
前缀匹配一组页面:如所有 /api/v1/ 下的 HTML 页面
location ^~ /api/v1/ {<br> expires 5m;<br> add_header Cache-Control "no-cache, must-revalidate";<br>} -
正则匹配带参数或路径特征的页面:如含 query string 的监控页
location ~ ^/health\.html(\?.*)?$ {<br> expires epoch;<br> add_header Cache-Control "no-store, no-cache";<br>}
避开常见陷阱
很多配置失效,是因为 location 没命中或被覆盖:
- 不要把
expires放在location /或location ~ \.html$这类宽泛规则里——它会误缓存所有 HTML,包括需要实时更新的后台页 - 如果页面由后端动态生成(如 PHP、Node.js),Nginx 默认不缓存响应体;此时
expires只影响响应头,实际是否缓存取决于后端是否允许(如未返回Cache-Control: public,浏览器仍可能忽略) - 多个 location 嵌套时,优先级是
location =>location ^~>location ~>location /,确保高优先级规则写在前面
配合 Cache-Control 强化语义
expires 只设 Expires 头,现代浏览器更认 Cache-Control。必须搭配使用:
- 短时效页面(如运营活动页):
expires 10m;<br>add_header Cache-Control "public, max-age=600";
- 禁止缓存的管理页:
expires epoch;<br>add_header Cache-Control "no-cache, no-store, must-revalidate";
- 注意:
add_header在同一作用域重复写会覆盖,多值要合并成一条
验证是否生效
改完配置别跳过这步:
- 先运行
nginx -t检查语法,再nginx -s reload - 用
curl -I https://yourdomain.com/about.html查看响应头,确认同时出现:Expires: ...<br>Cache-Control: public, max-age=3600
- 若没出现,检查该请求是否真由当前 server 块处理(确认
server_name匹配)、是否被 proxy_pass 转发(上游可能覆盖头)、或文件是否实际由 Nginx 直接提供(而非后端返回)











