使用Varnish HTTP加速器清除目录下的所有文件

4
有可能使用Varnish清除特定目录下的所有文件吗?您怎样在PHP脚本中完成这个操作?
例如,如果一个URL包含路径/product/a-specific-product/,那么是否也可以清除诸如/product/a-specific-product/a-sub-page/之类的文件?
我有以下用于清除Varnish 3中特定URL的函数(属于类VarnishPurger()):
public function executePurge()
{
    $purgeUrls = array_unique($this->purgeUrls);

    foreach($purgeUrls as $url)
    {
        $this->purgeUrl($url);
    }

    if (!empty($purgeUrls))
    {
        $this->purgeUrl(home_url());
    }        
}

protected function purgeUrl($url)
{
    $c = curl_init($url);
    curl_setopt($c, CURLOPT_CUSTOMREQUEST, 'PURGE');
    curl_exec($c);
    curl_close($c);    
}
2个回答

2
您可以在Varnish中创建自定义PURGE处理程序,使用例如ban_url()来处理正则表达式清除。
例如,在PHP中,当您想要清除添加自定义HTTP标头以供Varnish检测时。
curl_setopt($c, CURLOPT_HTTPHEADER, array('X-Purge-Regex-URL'));

在vcl_recv()中添加以下内容:
if (req.http.X-Purge-Regex-URL) {
  if (!client.ip ~ purge) {
    error 405 "Not allowed.";
  }
  ban_url(req.url);
  error 200 "Banned URL";
}

现在,当您发出对/product/a-specific-product/的清除请求时,匹配正则表达式的所有内容,包括/product/a-specific-product/a-sub-page/将被清除。
请注意,HTTP主机将被忽略,因此如果您正在运行虚拟主机并且只希望清除特定站点,则需要改用ban(),并使用req.http.hostreq.url参数。如果您需要这种解决方案,请告知我。
另外,如上所述,清除是一个正则表达式清除,因此清除/product将清除匹配product所有 URL。

0
尝试这个:
// $version = VERSION_OF_VARNISH;
$command = $version >= 3 ? "ban" : "purge";
exec("$command req.http.host ~ $host && req.url ~ \"$pattern\"");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接