僅清除命中的具體物件變體(如未壓縮版本),無法同時清除 gzip 版本。
acl purge { "localhost"; "192.0.2.14"; }
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) { error 405 "Not allowed."; }
lookup;
}
}
sub vcl_hit {
if (req.request == "PURGE") { set obj.ttl = 0s; error 200 "Purged."; }
}
sub vcl_miss {
if (req.request == "PURGE") { error 404 "Not in cache."; }
}
acl purge { "localhost"; "192.0.2.14"; }
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) { error 405 "Not allowed."; }
purge("req.url == " req.url); # 精確匹配
# purge("req.url ~ " req.url); # 正則匹配
}
}
PURGE / HTTP/1.0
Host: www.example.com
送至 Varnish 80 port 即可觸發。
telnet 192.168.1.185 3500
# 或
varnishadm -T 192.168.1.185:3500
| 指令 | 用途 | 範例 |
|---|---|---|
| purge.url <regexp> | URL 正則清除 | purge.url ^test.html$ |
| purge <field> <op> <arg> [&& ...] | 多條件彈性清除 | purge req.http.host == izhoufeng.com && req.url ~ ^/somedirectory/.*$ |
| purge.list | 列出待清除規則 | — |
purge req.url ~ ^/somedirectory/ && req.http.host == izhoufeng.compurge obj.http.Cache-Control ~ max-age=3600
function varnish_purge($ip, $host, $url) {
$fp = fsockopen($ip, 80, $errno, $errstr, 5);
if (!$fp) return false;
$request = "PURGE $url HTTP/1.0\r\nHost: $host\r\n\r\n";
fwrite($fp, $request);
fclose($fp);
return true;
}
function varnish_adm_purge($mgmt_ip, $mgmt_port, $regex) {
$fp = fsockopen($mgmt_ip, $mgmt_port, $errno, $errstr, 5);
if (!$fp) return false;
fwrite($fp, "purge.url $regex\n");
fclose($fp);
return true;
}