基于Varnish-devicedetect cookie的用户代理覆盖是否需要vary:cookie才能进行正确的浏览器缓存?

时间:2014-01-08 02:20:25

标签: caching cookies user-agent varnish http-caching

varnish-devicedetect让我根据用户代理返回不同的回复:

...
elsif (req.http.User-Agent ~ "(?i)ipad")        { set req.http.X-UA-Device = "tablet-ipad"; }
elsif (req.http.User-Agent ~ "(?i)ip(hone|od)") { set req.http.X-UA-Device = "mobile-iphone"; }
...

并允许用户通过设置Cookie来选择不同的设备体验:

if (req.http.Cookie ~ "(?i)X-UA-Device-force") {
  ...
}

我是否需要添加Vary: Cookie才能获得正确的客户端缓存行为?

例如:

  1. 我只设置Vary: User-agent
  2. 用户浏览example.com/beep
  3. 他们选择加入桌面体验,设置X-UA-Device-force: pc
  4. 他们重新加载example.com/beep 他们的浏览器是否会使用缓存的移动版本,因为只有Cookie,而不是用户代理更改了?

2 个答案:

答案 0 :(得分:1)

是的,您需要设置Vary: Cookie标头才能获得正确的行为,因为不同的Cookie会检索不同的输出。

您还需要在vcl_recv上设置适当的X-UA-Device来处理Cookie,以便在清漆中正确地散列项目。

答案 1 :(得分:0)

如果您改变了cookie,那么您也可以通过缓存窗口,因为大多数用户将拥有不同的cookie(特别是如果您的网站上有任何分析),因此您的命中率较低且多个副本缓存中的相同数据。

不是改变cookie,而是对特定的cookie值进行散列,如下所示:

if (req.http.cookie ~ "(?i)X-UA-Device-force" ) {
  hash_data("deviceforce");
} else {
  hash_data("nodeviceforce");
}