假设我有一个“资源” - http://localhost/doc
,我希望它会被Varnish 一直缓存,因为它经常被访问,除了某人通过POST更新它,POST更新完成后,所有进一步的请求应该检索最新版本的“doc”。
我的想法是将这个逻辑包装在我的后端服务器中,因为POST请求默认情况下会通过Varnish而不进行缓存,而在我的后端服务器中我可以:
varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
curl -X PURGE http://localhost/doc
但是,我需要配置VCL来尊重“Cache-Control
”标题!
我的VCL就像下面但不起作用:
sub vcl_fetch {
if (beresp.http.Cache-Control ~ "no-cache") {
purge;
}
return (deliver);
}
acl purgers { "127.0.0.1"; }
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purgers) {
error 405 "Method not allowed";
}
return (lookup);
}
}
sub vcl_hit {
if (req.request == "PURGE") {
#purge;
purge("req.url ~ " req.url);
error 200 "Purged";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 200 "Purged";
}
}
sub vcl_pass {
if (req.request == "PURGE") {
error 502 "PURGE on a passed object";
}
}
抱怨:
Message from VCC-compiler:
Expected ';' got '('
(program line 174), at
('input' Line 154 Pos 14)
purge("req.url ~ " req.url);
-------------#-----------------------
Running VCC-compiler failed, exit 1
VCL compilation failed
感谢您的回复!
答案 0 :(得分:0)
您的应用程序服务器可以在更新文档时发出清除URL的请求。它需要发送PURGE请求而不是文档的GET请求。
或者,当您收到该URL时,您可以对该URL发出禁令。