nginx 中 add_header 无法直接判断缓存命中,但可通过 $upstream_cache_status 变量在响应头中标记缓存状态(如 hit、miss);需先配置 proxy_cache_path 和 proxy_cache,并在启用缓存的 location 块中使用 add_header x-cache-status $upstream_cache_status 输出状态。

在 Nginx 中,`add_header` 本身不能直接判断缓存是否命中(因为它是静态指令,不支持条件逻辑),但可以配合内置变量(如 `$upstream_cache_status`)在响应头中添加缓存状态标记,从而让客户端或调试工具识别本次响应是否来自缓存。
确认启用代理缓存并捕获状态
Nginx 的 `$upstream_cache_status` 变量仅在配置了 `proxy_cache` 后才有效,其值可能为:HIT、MISS、BYPASS、EXPIRED、STALE 等。需先确保已正确配置缓存区和 `proxy_cache` 指令:
- 定义缓存区:`proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;`
- 在 location 或 upstream 上启用:`proxy_cache my_cache;`
- 设置缓存键与过期策略(如 `proxy_cache_key`, `proxy_cache_valid`)
用 `add_header` 输出缓存状态
在启用了 `proxy_cache` 的 location 块中,使用 `add_header` 引用 `$upstream_cache_status`:
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 10m;
add_header X-Cache-Status $upstream_cache_status;
}
这样每次响应都会带上类似 X-Cache-Status: HIT 的头。注意:`add_header` 不会继承父块,必须写在启用缓存的 location 内;且它不会覆盖已有同名响应头(Nginx 默认追加)。
增强可读性与调试友好性
可进一步将状态映射为更直观的标记(如“缓存命中”),但 Nginx 原生不支持在 `add_header` 中直接做字符串替换。可行做法包括:
- 使用 `map` 指令预定义中文/英文别名(推荐):
map $upstream_cache_status $cache_label { HIT "HIT"; MISS "MISS"; EXPIRED "STALE"; default "PASS"; } # 然后在 location 中: add_header X-Cache $cache_label; - 搭配 `add_header` + `always`(若需在出错响应中也显示):`add_header X-Cache-Status $upstream_cache_status always;`
- 避免在 `if` 块中使用 `add_header`(不生效)——该指令不支持条件上下文
验证与注意事项
重启 Nginx 后,用 curl 测试:
curl -I https://example.com/some-resource
观察响应头中是否出现 `X-Cache-Status: HIT`。常见问题:
- 首次请求一定是
MISS,第二次相同请求才可能为HIT(取决于缓存策略) - 动态内容(如带 Set-Cookie、Cache-Control: no-cache)默认不缓存,状态常为
BYPASS - 浏览器开发者工具 Network 标签页可直观查看该 header,便于前端调试缓存行为











