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
X-UA-Device-force:pc
他们的浏览器是否会使用缓存的移动版本,因为只有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
。。。还有其他选择吗?