Varnish 4.0 多匹配

Varnish 4.0 multiple matches

我需要同时使一个参数的多个特定值在 Varnish 中的缓存失效。现在代码按照以下模式进行调用:

varnish_host/path?.*parameter=1
varnish_host/path?.*parameter=2
varnish_host/path?.*parameter=3
varnish_host/path?.*parameter=4

并按照此处找到的 Varnish 2.0 文档 https://kly.no/varnish/regex.txt 我发现了这条用于多重匹配的规则

Multiple matches
    req.url ~ "\.(jpg|jpeg|css|js)$"
    True if req.url ends with either "jpg", "jpeg", "css" or "js".

所以我更改了我的代码以按照以下方式进行调整

varnish_host/path?.*parameter=(1|2|3|4)$

但它没有按预期清理缓存,即使它 returns 状态为 200。

在 Varnish 4.0 中有没有办法在参数中进行这种多重匹配?如果是这样,我们应该考虑的变体数量是否有限制?

Varnish 不提供 out-of-the-box HTTP-based 失效机制。

你能做的是issue bans using varnishadm。这将允许您设置匹配多个 objects.

的正则表达式模式

Varnishadm 禁令示例

这是一个这样的例子,我们将在 example.com 主机名的缓存中使每个 PNG 文件无效:

varnishadm ban req.http.host == example.com '&&' req.url '~' '\.png$'

HTTP-based 禁止和清除

varnishadm 工作正常,但集成到您的逻辑中并不那么容易。如果你想通过 purgeban 从缓存中使 objects 失效,你需要写一些 VCL。

这是一个 VCL 片段,可以促进 HTTP-based 失效:

vcl 4.0;

acl purge {
    "localhost";
    "192.168.55.0"/24;
}

sub vcl_recv {
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return(synth(405, "Not allowed."));
        }
        if (!req.http.ban-url) {
            return(purge);
        }
        ban("obj.http.x-host == " + req.http.host + " && obj.http.x-url ~ " + req.http.ban-url);
        return(synth(200, "Ban added"));
    }
}

sub vcl_backend_response {
    set beresp.http.x-url = bereq.url;
    set beresp.http.x-host = bereq.http.host;
}

sub vcl_deliver {
    unset resp.http.x-url;
    unset resp.http.x-host;
}

Important: you need to adjust the values of the ACL, which will prohibit unauthorized access to the invalidation interface. You can use IP addresses, IP ranges, and hostnames to limit access.

以下是我们如何通过 HTTP 执行相同的 PNG 失效:

curl -XPURGE -H"ban-url: '\.png$'" http://example.com/

您也可以只使单个 URL:

无效
curl -XPURGE http://example.com/my-page

因为上面的示例不包含 ban-url 请求 header,只有确切的 URL 无效,而不是开始匹配的模式。