缓存键设计与proxy_no_cache是协同关系:前者决定“什么算同一请求”,后者决定“响应是否存储”;需结合用户身份、设备、语言等维度设精准key,并用proxy_no_cache+proxy_cache_bypass双指令兜底过滤敏感请求。

缓存键设计和 proxy_no_cache 不是替代关系,而是协同关系:前者决定“什么算同一个请求”,后者决定“这个响应要不要存”。真正优化键策略,是要让缓存键足够精准,同时用 proxy_no_cache 避免因键不够细而误存的敏感内容——两者配合,才能既提升命中率,又守住数据安全边界。
缓存键要包含影响响应内容的关键维度
默认的 $scheme$proxy_host$request_uri 往往不够用。比如带用户身份、设备类型或地域参数的接口,若键里不体现这些,不同用户的响应可能互相覆盖。
- 登录态相关接口:在
proxy_cache_key中显式加入$cookie_sessionid或$http_x_user_id,让每个用户有独立缓存项 - 多端适配页面:加入
$http_user_agent的哈希片段(如md5($http_user_agent)),避免 PC 和移动端缓存混用 - 国际化资源:把
$http_accept_language或$arg_lang加入键中,防止中英文内容错乱 - 注意:不要直接写
$http_cookie全量,易导致键过长且不稳定;优先提取关键字段如$cookie_token
proxy_no_cache 用于兜底过滤“不该缓存”的响应
即使缓存键设计得再细,有些场景仍不适合缓存——比如临时调试、高权限操作、含实时状态的接口。这时不能靠改键来规避,而要用 proxy_no_cache 明确禁止落盘。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 必须搭配
proxy_cache_bypass使用,二者共用同一组布尔变量,例如:
proxy_cache_bypass $no_cache_by_role $no_cache_by_arg;<br>proxy_no_cache $no_cache_by_role $no_cache_by_arg;
- 典型兜底信号包括:
• 请求头含X-User-Role: admin
• URL 包含/debug或/admin/
• 查询参数带nocache=1或_t=123456789 - 关键点:所有
map的default必须设为0,否则空值会意外触发绕过
静态资源与动态接口要分路径隔离处理
混合配置容易互相干扰。建议用独立 location 拆分流量,让缓存键和缓存策略各司其职。
- 对
/static/、.js、.css等路径,用简单键 + 长期缓存:
proxy_cache_key "$scheme$request_uri";<br>proxy_cache_valid 200 302 1y;
- 对
/api/路径,启用精细化键 + 动态绕过:
proxy_cache_key "$scheme$request_uri$http_authorization$cookie_sessionid";<br>proxy_cache_bypass $no_cache_by_login $no_cache_by_path;<br>proxy_no_cache $no_cache_by_login $no_cache_by_path;
- 确保两个 location 都已启用
proxy_cache my_cache,否则bypass和no_cache不生效
验证是否按预期工作
光配对没用,得看实际行为是否符合设计。
- 检查响应头:
• 正常命中应有X-Cache: HIT或X-Cache: MISS
• 绕过时应为X-Cache: BYPASS,且$upstream_cache_status变量值为BYP - 抓包确认后端是否被真实调用(绕过时应每次回源)
- 查看缓存目录下对应 key 的文件是否存在(绕过时不应生成新文件)

















