我有一个网站只有少数几个来源的流量高峰。该站点还需要能够通过猜测用户是否刚刚使用 PHP $_SERVER["HTTP_REFERER"] 到达站点来向用户显示内容。
是否可以在清漆缓存中包含 req.http.referer 的值,以便这种行为更多地基于个人用户?我相信某些用户正在显示错误的内容,因为另一个用户缓存了具有不同引荐来源值的内容。
如果您希望缓存在所有可能的引用上都不同,那么 http 协议 Vary-header 是您的解决方案。如果您的流量与来自极少数唯一 URL 的引荐来源不太一致,那实际上会杀死您的缓存命中率。
我认为更好的解决方案是从php层去除猜测谁是新用户的逻辑并将其添加到varnish中。这可以通过在 vcl_recv 中为请求设置一个自定义标头来完成,然后使用该标头在 vcl_hash 中通过添加类似这样的内容到 vcl_recv
if ((req.http.referer ~ "www.newuserhost1.com" || req.http.referer ~ "www.newuserhost2.com") &&
req.url == "/") {
req.http.X-New-User = 1;
}
并将其添加到 vcl_hash
hash_data(req.http.X-New-User);
当用户到达您的后端时,您可以从那里检查 X-New-User 的值而不是referer。
HTTP 规范对此有解决方案。Vary 响应标头指示在生成内容时考虑了哪些请求标头。
在后端响应中添加“Vary:Referer”标头,Varnish 将为每个客户端提供正确的变体。