我使用以下代码来清理网站的主页:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com:8080/");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);
$r = curl_exec($ch);
echo "<PRE>$r</PRE>";
curl_close($ch);
Varnish的回应如预期:
HTTP/1.1 200 Purged.
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 382
Accept-Ranges: bytes
Date: Fri, 10 Aug 2012 10:50:56 GMT
X-Varnish: 617777456
Age: 0
Via: 1.1 varnish
Connection: close
X-Cache: MISS
所以现在我认为它被清除了,但是进一步调用页面检查标题表明它没有被清除。由于Age: 15
和X-Cache: HIT
都设置了,建议页面仍然被缓存,并且已经过了15秒。
TTL是120。
我错过了什么吗?
由于 杰克
答案 0 :(得分:3)
为了消除所有其他php / curl问题,我将从最基本的低级别检查开始。
这对我有用:
netcat -C varnish_hostname 80 <<EOF
PURGE /the/url
Host: hostname
EOF
一旦你开始工作,你知道你的VCL规则和ACL不是问题,你可以进入curl / php级别。
编辑两个注释:
netcat -C
选项用于根据HTTP协议将换行符转换为CRLF字符对。答案 1 :(得分:2)
我认为你不会检查default.vcl中的清除 default.vcl应包含以下内容:
acl purge {
"localhost";
"192.168.55.0"/24;
}
sub vcl_recv {
# allow PURGE from localhost and 192.168.55...
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return (lookup);
}
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
error 200 "OK but nothing to purge - URL was not in cache";
}
}
答案 2 :(得分:1)
我想评论你应该发布你的default.vcl文件,但我的声誉太低了。
PURGE是在您的vcl文件中实现的(或者至少它应该如果您希望它可以工作),它的作用和不做的是代码。它可能会根据您连接的IP地址阻止您的PURGE,或者可能无法实现。
答案 3 :(得分:1)
要知道,PURGE在beReq上工作。
如果修改req.url(即为URI添加前缀或后缀),则应在调用purge的vcl_recv中执行相同操作。 或者,您必须在网址操作之后在主vcl_recv 中写入清除条件。