在Varnish缓存页面中包含req.http.referer

koo*_*osa 0 php ubuntu varnish

我有一个网站只有少数几个来源的流量高峰.该网站还需要能够通过猜测他们是否刚刚使用PHP $ _SERVER ["HTTP_REFERER"]到达网站来向用户显示内容.

是否可以在清单缓存中包含req.http.referer的值,以便此行为更多地基于单个用户?我认为有些用户显示错误的内容是因为另一个用户使用不同的引用者值缓存内容.

小智 5

如果您希望所有引用的缓存都不同,那么http协议Vary-header就是您的解决方案.如果您的流量不是非常统一,那么这将极少会破坏您的缓存命中率来自极少数唯一网址的引用者.

我认为更好的解决方案是从php层中删除猜测谁是新用户的逻辑并将其添加到清漆中.这可以通过在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;
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到vcl_hash

 hash_data(req.http.X-New-User);
Run Code Online (Sandbox Code Playgroud)

当用户到达后端时,您可以从那里检查X-New-User的值而不是referer.