要让 fastcgi_cache_key 生成真正唯一的缓存指纹,关键在于精准表达共享缓存的请求范围:必须包含 $scheme$request_method$host$request_uri$is_args$clean_args$app_id,并按业务需求添加登录态、终端类型、api 版本等因子,同时主动清洗干扰参数并验证生效。

要让 fastcgi_cache_key 生成真正唯一的缓存指纹,关键不是堆变量,而是精准表达“哪些请求该共享同一份缓存”。漏掉业务维度会污染内容,冗余变量又导致缓存碎片——得按实际场景选配、清洗、验证。
必须包含的核心维度
默认的 $scheme$host$request_uri 不够用,至少补全以下三项:
-
请求方法:加上
$request_method,避免 HEAD 请求覆盖 GET 缓存 -
查询参数:显式加入
$args($request_uri虽含参数,但 Nginx 某些版本或配置下不稳定) -
应用标识:多站点共用缓存区时,必须区分来源,推荐用
$server_name或自定义$app_id
按业务需求加差异化因子
不是所有请求都该一视同仁。需根据实际逻辑决定是否引入以下变量:
- 登录态:用
md5($cookie_user_id)替代明文$cookie_user_id,防泄露且控长度 - 终端类型:优先取
$http_x_requested_with(值为XMLHttpRequest或空),比解析 User-Agent 更轻量稳定 - API 版本:若后端通过
?v=2或X-API-Version区分,可提取进 key,如$arg_v或自定义 map 变量
主动过滤干扰参数
UTM、随机数、时间戳等不改变响应内容,却会让 key 大量膨胀。不能靠 fastcgi_ignore_headers 解决,得提前清洗:
- 在
http块中用map提取干净参数串,例如剔除utm_*、ts=、random= - key 中使用清洗后变量:
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$clean_args$app_id"; - 避免用
if处理 URI —— 官方明确提示其在缓存上下文中行为不可预测
验证 key 是否真实生效
写完配置不等于起效,必须实测:
- 加日志格式:
log_format cache '$cache_key - $upstream_cache_status';,再启用该 access_log - 用
curl -I看响应头:X-FastCGI-Cache(需配add_header)和Age字段变化 - 临时设 key 为固定字符串(如
"test_key"),观察不同请求是否全部命中 HIT,快速确认配置加载成功
不复杂但容易忽略。











