如何使Varnish清除URL的所有变体?

时间:2012-08-05 18:48:35

标签: varnish

Varnish 2.1:我正在尝试使用http PURGE让Varnish续订一个缓存的URL。

在测试时,我会得到看起来很奇怪的结果,直到我在文档中读到这一点:“如果缓存中存在相同URL的多个变体,则只会清除匹配的变体。清除gzip变体在同一页面中,请求必须如下所示:“

现在,如果我执行这两个命令:

curl -I http://example.com/my-url
curl -X PURGE http://example.com/my-url

我收到了200 Purged的回复。

如果我这两个:

curl -I http://example.com/my-url -H "Accept-Encoding: gzip"
curl -X PURGE http://example.com/my-url -H "Accept-Encoding: gzip"

我也获得了200 Purged。

现在,如果我尝试:

curl -I http://example.com/my-url -H "Accept-Encoding: deflate"

我收回标题,表明Content-Encoding:是“text / html; charset = utf-8”,并且它在缓存中有年龄。这似乎表明我的应用程序不支持“deflate”,这可能是正确的。

该页面还有一个Age:标题,表示它正在被缓存。

现在我该如何清除它? (我问的是一个没有实际意义的问题吗?)

所有这些尝试都返回“404 Not in cache”:

curl -X PURGE http://example.com/my-url -H "Accept-Encoding: deflate"
curl -X PURGE http://example.com/my-url -H "Accept-Encoding: text/html;charset=utf-8"
curl -X PURGE http://example.com/my-url -H "Accept-Encoding: text/html"

有没有一种神奇的方法可以清除网址的所有变体?

2 个答案:

答案 0 :(得分:5)

啊哈,通过申请一些google-fu,我偶然发现了一篇论坛帖子,其中暗示了以下内容:

purge("req.url ~ ^" req.url "$"); 

即。使用清除后面的正则表达式来处理所有Accept-Encoding标题。

此处有更多信息:http://www.gossamer-threads.com/lists/varnish/misc/15124

..这意味着你需要修改你的VCL。

答案 1 :(得分:3)

我认为这就是你需要的:

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") {
                purge;
                error 200 "Purged.";
        }
}