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

时间:2012-12-04 23:44:14

标签: php ubuntu varnish

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

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

2 个答案:

答案 0 :(得分:5)

如果您希望所有引用的缓存都不同,那么http协议Vary-header就是您的解决方案。如果您的流量不是很均匀,那么这很可能会导致您的缓存命中率降低。来自极少数唯一网址的引用。

我认为更好的解决方案是从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。

答案 1 :(得分:1)

HTTP规范有解决方案。 Vary响应标头指示在生成内容时考虑了哪些请求标头。

在后端响应中添加“Vary:Referer”标头,Varnish将为每个客户端提供正确的变体。

相关问题