$proxy_cache_key 中必须显式包含 $scheme 以区分 http/https 缓存,避免混合内容、跳转异常等问题;推荐写法为 "$scheme|$host|$request_uri|$is_args$args",并根据协议隔离需求选择共用或独立 keys_zone。

proxy_cache_key 中包含 $scheme 是区分 HTTP 与 HTTPS 请求缓存的最直接方式。因为同一 URL 在 HTTP 和 HTTPS 下可能指向不同后端逻辑、证书校验策略或安全头处理,若缓存混用,容易导致混合内容警告、跳转异常或敏感响应被错误复用。
你需要确保 $scheme 真正参与缓存键计算,并且整个缓存体系支持该维度隔离。
✅ 必须显式写入 $scheme,不能依赖默认值
Nginx 默认 proxy_cache_key 是 $scheme$proxy_host$request_uri,看似已含 $scheme,但注意:
-
$proxy_host是上游服务器地址(如backend:8080),不是客户端访问的 host; - 若你用
proxy_pass https://...固定协议转发,$scheme反而固定为https,失去区分意义; - 更常见的是反向代理统一走 HTTP 到后端,此时
$scheme才反映用户真实请求协议(http或https)。
所以推荐显式定义,清晰可控:
proxy_cache_key "$scheme|$host|$request_uri|$is_args$args";
竖线 | 仅作分隔符,避免拼接歧义(例如 httpsexample.com/ 会误判)。
✅ 配合 server 块做协议感知判断(可选但推荐)
如果业务对 HTTP/HTTPS 有不同缓存策略(比如 HTTPS 页面强制不缓存登录态),可结合 map 提前标记:
map $scheme $cache_scheme {
http "http";
https "https";
}
server {
listen 80;
listen 443 ssl;
# ... ssl 配置省略
location / {
proxy_cache my_cache;
proxy_cache_key "$cache_scheme|$host|$request_uri|$is_args$args";
# ...
}
}
这样即使后续加其他逻辑(如重定向、Header 注入),$cache_scheme 也稳定可靠。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
✅ 注意缓存区是否共用:协议差异需物理隔离
多个协议共用同一个 keys_zone 时,仅靠 key 区分还不够保险。建议:
- 若 HTTP 和 HTTPS 内容完全独立(如 HTTP 强制跳转 HTTPS),可共用缓存区,key 中带
$scheme即可; - 若两者长期并存且缓存行为差异大(如 HTTP 缓存 1 分钟,HTTPS 缓存 1 小时),更稳妥的做法是声明两个独立缓存区:
proxy_cache_path /data/nginx/cache_http levels=1:2 keys_zone=http_cache:20m; proxy_cache_path /data/nginx/cache_https levels=1:2 keys_zone=https_cache:20m;
然后在对应 server 块中分别绑定:
server {
listen 80;
proxy_cache http_cache;
proxy_cache_key "$scheme|$host|$request_uri";
}
server {
listen 443 ssl;
proxy_cache https_cache;
proxy_cache_key "$scheme|$host|$request_uri";
}
这样不仅逻辑隔离,磁盘路径也分开,避免锁竞争和清理干扰。
✅ 验证是否生效的小技巧
-
用 curl 分别发 HTTP/HTTPS 请求,观察响应头中
X-Cache(需自行添加add_header X-Cache $upstream_cache_status;):curl -I http://example.com/test curl -I https://example.com/test
两次都显示
MISS→ 缓存未命中或 key 未生效;
一次HIT、一次MISS→$scheme起作用;
两次都HIT→ key 没包含$scheme或缓存区被复用。 -
查看缓存文件名哈希(调试用):
find /data/nginx/cache* -type f | xargs -I{} sh -c 'echo {}; nginx -t -c /dev/stdin /dev/null | grep -q "test" && echo "used"'(实际生产中不建议直接读缓存文件,仅用于验证目录归属)
不复杂但容易忽略










