Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的Varnish和条件代码_Php_Wordpress_Varnish - Fatal编程技术网

php中的Varnish和条件代码

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_

我在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_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的示例