答案是通过Nginx的fastcgi_cache基于$device_type构造差异化cache_key,并配合map识别设备、fastcgi_cache_bypass/no_cache控制微信绕过、add_header Vary "User-Agent"实现PC与移动端缓存隔离及EdgeOne协同。

核心思路是:不靠重定向、不换域名,而是让 Nginx 的 fastcgi_cache 根据设备类型生成**互不干扰的缓存键(cache key)**,同时确保 PC 端和移动端请求各自命中专属缓存,且微信等特殊 UA 可跳过缓存。这在 WordPress 等动态 CMS 场景下尤其关键——否则 PC 主题缓存被手机访问直接套用,页面错乱、JS 失效、菜单消失就成常态。
一、定义设备类型变量(精准识别)
避免简单匹配 “mobile” 字符串导致误判(比如某些 PC 浏览器 UA 含 mobile),推荐用 map 指令预定义,性能更高、更清晰:
map $http_user_agent $device_type {
default pc;
"~*iPhone|iPad|iPod" mobile;
"~*Android|Mobile|BlackBerry|WebOS|Windows Phone|Opera Mini|UCBrowser" mobile;
"~*MicroMessenger" wechat; # 单独标记微信,便于后续控制
}该配置放在 http 块内,全局生效。注意顺序:正则匹配从上到下,wechat 必须在 mobile 之前,否则会被 mobile 规则提前捕获。
二、构造差异化 cache_key(缓存隔离关键)
原生 fastcgi_cache_key 默认不含设备信息。需显式加入 $device_type,让 PC 和移动端生成完全不同的缓存哈希值:
fastcgi_cache_key "$scheme$request_method$host$request_uri$device_type";
这样:
– PC 访问 /wp-admin/ → 缓存 key 含 pc
– 手机访问同一 URL → key 含 mobile → 完全独立缓存条目
– 微信访问 → key 含 wechat,但后续可跳过缓存,不实际存储
三、按设备类型控制缓存行为(含微信绕过)
在 location ~ \.php$ 或 FastCGI 处理块中,结合 fastcgi_cache_bypass 和 fastcgi_no_cache 实现精细调度:
- 微信强制不缓存:防止 JS SDK、分享签名、登录态等因缓存失效
- 移动端与 PC 端均启用缓存,但各自隔离
- 登录用户、评论页、后台路径默认不缓存(保持基础安全)
示例配置:
fastcgi_cache my_cache;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_use_stale error timeout updating http_500;
<h1>微信UA不写入缓存,也不读缓存</h1><p>fastcgi_cache_bypass $device_type;
fastcgi_no_cache $device_type;</p><h1>仅当 $device_type 不为 wechat 时才参与缓存(即 wechat=1 时 bypass & no_cache 生效)</h1><p>set $skip_cache 0;
if ($device_type = "wechat") {
set $skip_cache 1;
}
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;四、适配腾讯云 EdgeOne 的 Vary 协同机制
EdgeOne 作为边缘缓存层,必须知道“同一 URL 对不同设备返回不同内容”,否则会把 PC 缓存分发给手机用户。只需在响应头中透传 Vary: User-Agent:
add_header Vary "User-Agent" always;
⚠️ 注意:
– always 参数确保即使返回 304 或错误码也带上该头
– Nginx 本地 fastcgi_cache 和 EdgeOne 边缘缓存共用同一套 cache_key 逻辑(都含 $device_type),就能形成“本地缓存 → 边缘缓存 → 浏览器”三层一致的设备感知链
– 不需要 EdgeOne 控制台额外配置设备识别规则,纯靠标准 HTTP Vary 协议协同
这套方案不依赖 rewrite 重定向,不拆子域名,不改业务代码,只通过 Nginx 配置实现动静态分离与缓存隔离,对 WordPress、Typecho 等常见 PHP CMS 开箱即用。


















