2012-12-04 35 views
0

我有了流量高峰从几个来源网站的网页。此网站还需要能够通过猜测他们是否刚刚使用PHP $ _SERVER [“HTTP_REFERER”]到达网站来向用户显示内容。包括req.http.referer清漆缓存

是否有可能包括在清漆缓存req.http.referer的值,因此,这种行为是更多的个人用户基础?我相信有些用户会因为其他用户缓存具有不同推荐人值的内容而显示错误的内容。

回答

5

如果你希望缓存是对所有可能的参照网址HTTP协议因人而异头是你的解决方案不同。如果您的流量与来自极少数唯一网址的查询者不是很一致,那几乎可以杀死您的缓存命中率。

我认为这是一个更好的解决方法是删除谁是从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; 
} 

并将其加入到vcl_hash

hash_data(req.http.X-New-User); 

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

+0

这很酷。所以我可以运行检查来查看引用者是否不是当前域?例如:'如果(!req.http.referer = req.http.href){req.http.X-NEW-USER = 1}' – koosa

+0

不完全是,你http.referer将包含一个完整的URL,如http:/ /www.somedomain.com/somepage。 'href'不存在作为http头,req.http.host不过只包含一个主机名,因此你需要一个正则表达式匹配,如: 'req.http.referer〜req.http.host' – Clarence

1

HTTP规范为此提供了解决方案。 Vary响应标题指示在生成内容时考虑了哪些请求标题。

添加“有所不同:Referer的”头到后端的响应和光油将成为正确的变形到每个客户端。