清漆:如果我在hash_data中有cookie,则清除

时间:2016-12-09 16:40:52

标签: varnish varnish-4

问题

我无法清除我的页面。经过很多次,我决定找出净化的工作原理并找到它!

  

正如您所看到的,我们使用了新动作 - 返回(清除)。这结束了vcl_recv的执行并跳转到vcl_hash。这就像我们处理常规请求一样。当vcl_hash调用return(lookup)时,varnish将清除该对象,然后调用vcl_purge。在这里,您可以选择在清除对象后添加您希望Varnish采取的任何特定操作。 docs

然后我明白我在hash_data中有cookie并且我无法清除特定的URL。

问题

如何通过URI清除我的所有页面?我认为禁令制度无法帮助我。也许你建议我一件事?

1 个答案:

答案 0 :(得分:1)

Purge方法仅适用于所请求的特定网址。使用Purge不能使用正则表达式。 例如:发出www.example.com/uri请求并调用Purge,只有整个URL的对象才会从缓存中删除。然后,如果要使用Purge,则必须在VCL上实现以下功能:

acl purge {
    "localhost";
    "192.168.55.0"/24;
}
sub vcl_recv {
        ...
        # allow PURGE from localhost and 192.168.55...

        if (req.method == "PURGE") {
                if (!client.ip ~ purge) {
                        return(synth(405,"Not allowed."));
                }
                return (purge);
        }
        ...
}

之后,您需要做的就是清除URL,就是使用Purge方法向您的Varnish发送请求,如下所示:

$ curl -X PURGE "www.example.com/desired/uri"

当您只想使用一个请求删除许多对象时,将使用禁令。这可以使用Purge中不可用的正则表达式来完成。为了使用它,你应该有一个类似于下面的代码,保持之前的acl:

sub vcl_recv {
        ...
        if (req.method == "BAN") {
                # Same ACL check as above:
                if (!client.ip ~ purge) {
                        return(synth(403, "Not allowed."));
                }
                ban("req.http.host == " + req.http.host +
                      " && req.url ~ " + req.url);

                # Throw a synthetic page so the
                # request won't go to the backend.
                return(synth(200, "Ban added"));
        }
        ...
}

禁止对象类似于清除,但现在您可以发送正则表达式。以下示例显示如何禁止主机www.example.com中的所有png文件:

$ curl -X BAN "www.example.com/.png$"

所有信息均来自Varnish docs

我希望这个答案可以帮助您了解禁令和清除的工作原理,并确定它们如何为您提供帮助。

如果遗漏了任何内容或者没有满足您的需求,请编辑您的问题,以便在您的怀疑中更清楚(tittle和可能导致混淆的问题之间存在分歧)并且我很乐意编辑答案。