Caching Varnish devicedetect基于cookie的用户代理覆盖是否要求更改:cookie用于正确的浏览器缓存?

Caching Varnish devicedetect基于cookie的用户代理覆盖是否要求更改:cookie用于正确的浏览器缓存?,caching,cookies,user-agent,varnish,http-caching,Caching,Cookies,User Agent,Varnish,Http Caching,允许我根据用户代理返回不同的响应: ... 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

允许我根据用户代理返回不同的响应:

...
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
以获得正确的客户端缓存行为

例如:

  • 我只设置了
    Vary:User-agent
  • 用户浏览example.com/beep
  • 他们选择桌面体验,设置
    X-UA-Device-force:pc
  • 他们重新加载example.com/beep。
    他们的浏览器是否会使用缓存的移动版本,因为只有Cookies,而不是用户代理发生了变化
    是的,您需要设置一个
    Vary:Cookie
    头以获得正确的行为,因为不同的Cookie将检索不同的输出


    您还需要注意
    vcl_recv
    上的cookie,设置适当的
    X-UA-Device
    ,以便在varnish中正确地散列项目

    如果您更改cookie,那么您也可以通过窗口外缓存,因为大多数用户都会有不同的cookie(尤其是如果您的站点上有任何分析),因此您的缓存中会有低命中率和相同数据的多个副本

    不要改变cookie,而是对特定的cookie值进行如下哈希:

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

    同意,法利:饼干不好吃。我相信你可以通过非常小心地处理来自同一域的cookies来获得相当高的命中率。分析cookie通常是为分析服务的域(例如google.com)设置的,不应该影响我们应用程序域的缓存,不?对特定cookie进行哈希在varnish中完全有意义。如何向下游客户端(如浏览器)传递可缓存性?似乎唯一的选项是包含来自varnish的响应的
    Vary:cookie
    ,或
    no cache
    。。。还有其他选择吗?