忽略bot的Variable标头¶
Varnish开箱即可支持HTTP变体,但 Vary Header在某种程度上受到限制,因为它对完整的Header值进行操作。例如,如果您想要进行A/B测试活动或执行蓝/绿部署,您可以使用第一方Cookie让客户端“记住”他们的路径。
然而,当搜索引擎机器人请求内容时,他们很有可能不处理Cookie,而且很可能您更愿意快速响应。在这种情况下,您可能甚至不愿意尝试将类别分配给客户端,但在这种情况下,您将在缓存中创建一个新的变量,而不是A、B、蓝色、绿色或您的后端提供的任何服务。
如果内容的提供方式对机器人没有影响,因为你改变了按钮的颜色或其他与内容本身垂直的东西,那么你就有可能发生缓存未命中,给缓存添加不必要的变量,并以额外的延迟提供服务,从而产生有害的影响。
如果延迟是最重要的,您可以使用 req.hash_ignore_vary
以在查找过程中选择不同的匹配并获得最新的变体。
忽略Cookie是如何设置的,并假设后端总是提供准确的 Cache-Control 即使存在Cookie,下面也是A/B测试设置的一个示例,其中为机器人提供最新的变体:
import cookie;
include "devicedetect.vcl";
sub vcl_recv {
call devicedetect;
if (req.http.X-UA-Device ~ "bot") {
set req.hash_ignore_vary = true;
}
}
sub vcl_req_cookie {
cookie.parse(req.http.Cookie);
set req.http.X-AB-Test = cookie.get("ab-test");
return;
}
sub vcl_deliver {
unset resp.http.Vary;
}
还假设后端使用 Vary: X-AB-Test
页眉,并且不在其他页眉上变化。