繁体   English   中英

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

[英]Purge all files under a directory with Varnish HTTP accelerator

是否可以使用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);    
}

您可以在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/进行清除时,所有与regexp匹配的内容(包括/product/a-specific-product/a-sub-page/都将被清除。

请注意,HTTP主机被忽略,因此,如果您正在运行虚拟主机并且只希望清除特定站点,则需要使用ban()代替req.http.hostreq.url参数。 请让我知道您是否需要这种解决方案。

另外,如前所述,清除是一种regexp清除,因此清除/product将清除所有product匹配的URL。

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM