php中的Varnish和条件代码
我在PHP中有这样的代码php中的Varnish和条件代码,php,wordpress,varnish,Php,Wordpress,Varnish,我在PHP中有这样的代码 //get referer $reffere_Url = $_SERVER['HTTP_REFERER']; //if referer is abc.com then show the referer slider at home. if (strpos($reffere_Url, 'abc') !== false && $home_referal_slider!="") { $home_slider = $home_referal_
//get referer
$reffere_Url = $_SERVER['HTTP_REFERER'];
//if referer is abc.com then show the referer slider at home.
if (strpos($reffere_Url, 'abc') !== false && $home_referal_slider!="")
{
$home_slider = $home_referal_slider;
}
else
{
$home_slider = $home_slider;
}
但它总是返回$home\u滑块,即使条件变为真。
这是因为安装了varnish及其服务的网页缓存版本。请帮助我如何达到同样的效果。我试图检查vcl_rec to returnpass中的req.http.Referer值,但没有成功
还有另一种解决方案,只需将查询字符串?ex=exTrDz添加到url的referer页面上。这样就可以了。您需要告诉Varnish缓存什么以及如何缓存 第一个选项是覆盖Varnish中的vcl_散列,以包括referer:
sub vcl_hash {
hash_data(req.http.referer);
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
但这可能会严重影响您的缓存比率-每个不同的referer将获得其唯一的缓存池
更简洁的方法是从后端使用不同的头-这再次让Varnish知道这个响应缓存依赖于referer头。我主要使用不同的标题,因此我可以从后端控制Varnish的行为
在普通PHP中:
标题“变化”、“参考”;
但请注意,无论您使用哪一个$home_滑块,都需要设置该值。因此,如果在每个页面上都有逻辑,这将再次严重影响缓存比率
另一个选择是使用Edge Side Includes ESI从后端获取滑块,以便页面的其余部分可以正常缓存,但这要复杂得多
因此,最好的解决方案可能是将referer abc.com的所有流量传递到后端。希望这不是大多数访问者,它对缓存比率的影响最小
sub vcl_recv {
if (req.http.referer ~ "abc\.com") {
return (pass);
}
}
基于清漆4的示例