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



是否可以使用清漆清除特定目录下的所有文件?您如何在PHP脚本中完成此操作?

例如,如果URL包含路径/product/a-specific-product/,是否也可以清除/product/a-specific-product/a-sub-page/等文件?

我有以下函数用于清除 Varnish 3(类 VarnishPurger() 的一部分)中的特定 URL:

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);    
}

您可以在 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。

试试这个:

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

最新更新