1

问题

我无法清除我的页面。很多次之后,我决定找出清除的工作原理并找到!

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

然后我了解到我在 hash_data 中有 cookie,我无法清除特定的 url。

问题

如何通过 URI 清除我的所有页面?我觉得禁令系统帮不了我。也许你给我一些建议?

4

1 回答 1

1

Purge 方法仅适用于正在请求的特定 url。不能对 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"

当您想通过一个请求删除多个对象时使用 Ban。这可以使用 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中检索的。

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

如果缺少任何内容或无法满足您的需求,请编辑您的问题以使您的疑问更加清晰(标题与可能导致混淆的问题之间存在分歧),我很乐意编辑答案。

于 2016-12-12T13:12:42.410 回答