缓存键可通过显式拼接信任参数实现逻辑白名单,如用$arg_id$arg_lang构造key;配合map归一化参数顺序、location分级控制作用域,并需前后端协同规范参数命名与请求方式。

缓存键(Cache Key)本身不提供“白名单机制”,但可以通过显式拼接方式只纳入你信任的查询参数,从而实现逻辑上的白名单效果。关键不是过滤掉什么,而是只主动包含哪些。
只拼接指定 Query 参数
在 Nginx 中,用 $args 会带入全部参数,不可控;应改用 $arg_参数名 显式提取。例如只保留 id 和 lang:
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$arg_id$arg_lang";- 若任一参数为空,Nginx 自动忽略其值,不会引入多余分隔符
- 注意:不写
$arg_xxx就等于彻底排除该参数,哪怕它出现在原始 URL 中
用 map 提前归一化参数顺序与存在性
避免因参数顺序不同(如 ?lang=zh&id=123 vs ?id=123&lang=zh)导致 key 不一致:
- 定义 map 将参数组合为固定格式字符串:
map $arg_id:$arg_lang $cache_key_args {<br> ~^(.+):(.+) "$1_$2";<br> default ""; } - 再在 cache_key 中使用:
"$scheme$request_method$host$request_uri?$cache_key_args"
结合 location 精确控制作用域
白名单不应全局生效,而应按路径分级管理:
- 对公开接口(如
/api/v1/product)启用精简 key:location ^~ /api/v1/product {<br> fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$arg_id$arg_version";<br>} - 对含敏感参数的路径(如
/admin),直接禁用缓存或强制绕过:fastcgi_no_cache 1;<br>fastcgi_cache_bypass 1;
后端配合:统一参数命名与语义
前端传参需约定规范,否则白名单易失效:
- 禁止混用同义参数(如
lang/language/locale) - 要求幂等接口只用 GET + 明确参数,避免 POST 携带动态 body 影响 key 可靠性
- 若必须用 POST 查询,建议后端将关键筛选字段转为 query string,便于 Nginx 提取











