定义唯一的 fastcgi_cache_key 需明确“哪些请求该共享同一份缓存”,核心必须包含 $scheme、$request_method、$host、$request_uri,并按需加入哈希后的 $cookie_user_id、$http_x_requested_with 或 $app_id 等业务维度,安全处理 $args 时应预清洗干扰参数,最后通过日志与响应头实测验证。
定义唯一的 fastcgi_cache_key 不是拼变量,而是明确回答:“哪些请求该共享同一份缓存”。键值重复会污染缓存(比如用户 A 看到用户 B 的数据),遗漏关键维度则导致命中率暴跌(比如移动端返回 PC 版页面)。
基础结构要覆盖协议、方法、主机和路径,否则连最基础的区分都做不到:
?a=1&b=2部分需额外处理)是否加、怎么加,取决于你的业务逻辑。加错反而破坏共享性:
md5($cookie_user_id),避免明文泄露或键爆炸keys_zone
$args 是生成动态键的关键,但直接拼接风险高:
/report.php?s=2024 和 /report.php?s=2025 会被当成同一个缓存项$args 保留原始顺序和编码,适合多数场景,但要注意末尾可能带 &,建议配合 $is_args 使用(如 $is_args$clean_args)http 块中用 map 预清洗,例如剔除 utm_*、ts=、random=
配置写完不等于跑通,必须实测确认:
log_format cache '$cache_key - $upstream_cache_status';,再在 access_log 中启用curl -I 观察响应头:X-Cache-Status(需配 add_header X-Cache-Status $upstream_cache_status;)和 Age 字段变化Permission denied),Nginx 不报错但静默失效