[英]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.host
和req.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.