是否可以使用清漆清除特定目录下的所有文件?您如何在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.host
和 req.url
参数一起使用。如果您需要这种类型的解决方案,请告诉我。
此外,如前所述,清除是正则表达式清除,因此清除/product
将清除与product
匹配的所有 URL。
试试这个:
// $version = VERSION_OF_VARNISH;
$command = $version >= 3 ? "ban" : "purge";
exec("$command req.http.host ~ $host && req.url ~ "$pattern"");