nginx中实现移动端与pc端缓存隔离需用map归一化ua为mobile/tablet/desktop三类,注入proxy_cache_key(如"$host$request_uri$is_args$args|$device"),并按资源类型差异化启用:ssr html必须区分,静态资源可共用,api一般不区分;通过x-cache-device响应头和日志验证生效。

要在 Nginx 中实现移动端与 PC 端缓存隔离,核心不是简单加一个 $http_user_agent,而是用归一化方式提取终端类型,并将其稳定注入 proxy_cache_key,同时避免因 UA 字符串过长或频繁变化导致缓存碎片化。
用 map 提取标准化设备类型
直接使用 $http_user_agent 会造成大量重复缓存(比如 Chrome 120 和 121、iOS 17 与 18 的 UA 差异),应先做归类映射:
- 在
http块顶部定义统一的设备变量:
~*Mobile|Android|iPhone|iPad "mobile";
~*Tablet "tablet";
default "desktop";
}
- 该映射将千变万化的 UA 归为三类,确保同一终端类型的请求生成一致 key;
- 注意正则匹配顺序,
Mobile要放在Tablet前,防止 iPad 被误判为 mobile。
构造带设备标识的缓存键
在对应 server 或 location 块中设置 proxy_cache_key,显式包含 $device:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 推荐写法:
proxy_cache_key "$host$request_uri$is_args$args|$device"; - 加竖线
|分隔符,避免example.com/a?m=1mobile这类巧合拼接冲突; - 若需进一步区分登录态,可追加
$cookie_user_id,但未登录用户建议统一设为"guest",防止空值分裂缓存。
按设备类型差异化启用或绕过缓存
不是所有资源都需要双端隔离。应结合业务判断哪些内容真正因设备而异:
- SSR 渲染的 HTML 页面:必须区分
$device,因为返回结构不同; - 静态资源(JS/CSS/图片):通常无需区分,可共用一份缓存,提升复用率;
- API 接口:一般不按设备缓存,除非后端明确返回不同字段(如移动端精简字段),此时才加入
$device。
验证与可观测性
上线后必须确认隔离是否生效:
- 在响应头中添加:
add_header X-Cache-Device $device;,用curl -I查看实际识别结果; - 日志格式中加入设备和缓存状态:
log_format main '$remote_addr - $device [$time_local] "$request" $status $upstream_cache_status';; - 检查缓存目录下文件名哈希是否随
$device变化而不同(可通过find /path/to/cache -name "*xxx*" | head -5辅助观察)。










