You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Varnish为移动与桌面站点实现差异化缓存?

Varnish 实现移动/桌面站点独立缓存的 VCL 配置

核心思路是通过识别请求的 User-Agent 标记设备类型,将设备信息加入缓存键(Cache Key),让移动和桌面请求生成独立的缓存条目,确保各自访问对应缓存内容。

1. 设备识别与缓存键构建

在 vcl_recv 阶段完成设备识别,并扩展缓存键:

sub vcl_recv {
    # 默认标记为桌面设备
    set req.http.X-Device-Type = "desktop";

    # 匹配常见移动设备的 User-Agent 特征
    if (req.http.User-Agent ~ "(android|iphone|ipad|ipod|blackberry|windows phone|mobile|opera mini)") {
        set req.http.X-Device-Type = "mobile";
    }

    # 将设备类型加入缓存键,确保同一URL对应不同设备的缓存独立
    set req.hash += req.http.X-Device-Type;

    # 可选:将设备类型传递给后端Nginx,替代Nginx的User-Agent识别,减少重复处理
    set req.http.X-Device = req.http.X-Device-Type;
}

2. 后端响应缓存策略

在 vcl_backend_response 阶段可针对不同设备调整缓存规则:

sub vcl_backend_response {
    # 设置基础缓存时长
    set beresp.ttl = 1h;

    # 可选:为移动站点设置不同的缓存时长(示例)
    if (bereq.http.X-Device-Type == "mobile") {
        set beresp.ttl = 30m;
    }

    # 移除自定义头,避免返回给客户端
    unset beresp.http.X-Device-Type;
}

关键说明

  • 缓存键扩展逻辑:Varnish 默认缓存键包含请求方法、主机、URL 等信息,添加 X-Device-Type 后,同一 URL 的移动/桌面请求会生成不同的缓存键,从而实现独立缓存。
  • User-Agent 匹配优化:可根据业务需求补充更多设备特征,比如特定平板设备或小众浏览器的标识,提升识别准确性。
  • 后端协作:通过 X-Device 头将设备类型传递给 Nginx,可让 Nginx 直接基于该头分发内容,无需重复解析 User-Agent。

验证方法

用 curl 模拟不同设备请求,检查缓存命中状态:

# 模拟桌面请求
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" -I http://your-domain.com

# 模拟移动请求
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15" -I http://your-domain.com

观察响应头的 X-Cache 字段:首次请求为 MISS,再次请求应为 HIT,且移动/桌面请求的缓存状态互不干扰。

内容的提问来源于stack exchange,提问作者Gourav gaur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:40:51