要让 proxy_cache_key 支持多维度内容分发,关键在于显式拼接影响响应的变量:必须包含协议主机($scheme$host)、路径参数($uri$is_args$args)、请求方法($request_method),再按需加入用户标识(如$cookie_user_id)、设备类型(如$device)、语言或地域(如$http_accept_language),并注意空值处理、敏感信息过滤及大小写标准化。

要让 proxy_cache_key 支持多维度内容分发,关键在于把影响响应结果的变量显式拼进 key 字符串里,确保相同逻辑请求生成唯一 key,不同场景(如用户身份、设备类型、地域参数)自动分离缓存。
必须包含的基础维度
默认仅用 $uri 或 $request_uri 容易导致缓存污染。至少应组合以下三类信息:
-
协议与主机:用
$scheme$host区分 HTTP/HTTPS 和不同域名 -
路径与查询参数:用
$uri$is_args$args保证带参请求不被合并(注意$request_uri已含参数但可能含编码差异,推荐拆解) -
请求方法:加上
$request_method,避免 GET 和 HEAD 缓存互相覆盖
按业务需求加入动态变量
根据实际分发策略,选择性注入以下变量,注意它们需在请求中稳定可得:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
用户标识:如登录态 cookie(
$cookie_user_id)、token header($http_x_auth_token),适合个性化内容 -
设备类型:通过 UA 判断后设置变量,例如:
在 server 块顶部加:set $device "desktop";if ($http_user_agent ~* "(Mobile|Android|iPhone)") { set $device "mobile"; }
然后在proxy_cache_key中加入$device -
地域或语言:如
$http_accept_language、$geoip_country_code(需加载 geoip 模块)
避免常见陷阱
拼接 key 时容易忽略细节,导致缓存失效或冗余:
-
空值处理:未设置的变量会留空,可能使 key 不稳定。可用
map预定义默认值,例如:map $cookie_theme "" { default "light"; "~dark" "dark"; } -
敏感信息过滤:不要直接拼入
$cookie_session这类高敏字段,既不安全也不必要;优先用脱敏后的标识(如$cookie_user_hash) -
大小写与空格:UA、语言头等可能含大小写混用,建议统一转小写:
${lower:$http_user_agent}(需 nginx ≥ 1.19 +--with-http_realip_module)或用 map 映射标准化
一个生产可用的示例
适用于 API 接口,按用户、设备、语言三级分发:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args:$cookie_user_id:$device:$http_accept_language";
配合 proxy_cache_valid 对不同状态码设置合理过期时间,并确保对应 proxy_cache 的 keys_zone 内存足够(例如 keys_zone=api_cache:50m 可存约 40 万个 key)。

















