是否可以使用Varnish清除特定目录下的所有文件?你怎么能在PHP脚本中完成这个?
例如,如果网址包含路径/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);
}
答案 0 :(得分:2)
您可以在Varnish中创建自定义PURGE处理程序,以使用例如ban_url()
处理正则表达式清除。
例如在PHP中,当您要清除时,为Varnish添加一个自定义HTTP标头。
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/
发出清除时,与正则表达式匹配的所有内容都将被清除。
请注意,HTTP主机会被忽略,因此如果您正在运行虚拟主机并且只想要清除特定网站,则需要使用/product/a-specific-product/a-sub-page/
代替ban()
和req.http.host
参数。如果您需要这种类型的解决方案,请告诉我。
此外,如上所述,清除是正则表达式清除,因此清除req.url
将清除匹配/product
的所有网址。
答案 1 :(得分:0)
试试这个:
// $version = VERSION_OF_VARNISH;
$command = $version >= 3 ? "ban" : "purge";
exec("$command req.http.host ~ $host && req.url ~ \"$pattern\"");