通过 HTTP headers 或 url 中的 * 使清漆无效

Invalidate varnish by HTTP headers or by * in url

所以我有一些 url 像这样 www.example.com/userID/productID 这个 url 设置这个 HTTP headers X-Cache-Tags: product-productID, user-userID, product

现在我想清除 X-Cache-Tagsproduct-productID 的所有缓存,或者我想清除所有 www.example.com/*/productID

的 url

这可能吗?

这是实现它所需的 VCL 代码:

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));
        }
        if(!req.http.x-invalidate-tag && !req.http.x-invalidate-pattern) {
            return(purge);
        }
        if(req.http.x-invalidate-tag) {
            ban("obj.http.X-Cache-Tags ~ " + req.http.x-invalidate-tag);
        } else {
            ban("obj.http.x-url ~ " + req.http.x-invalidate-pattern
            + " && obj.http.x-host == " + req.http.host);
        }
        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;
}

有 3 种方法可以使用此 VCL 从缓存中删除内容:

  1. 清除个人 URL
  2. 禁止所有 object 匹配缓存标签的内容
  3. 禁止 URL 与模式匹配的所有 objects

清除URL

当具有批准的客户端 IP 的请求执行 PURGE 请求时,仅使用确切的 URL 从缓存中删除 object:

curl -XPURGE http://example.com/20/100

禁止使用缓存标签

以下 curl 请求将从缓存中删除所有 object 具有包含标记 product-10X-Cache-Tags 响应 header 的所有 object:

curl -XPURGE -H "x-invalidate-tag: product-10" http://example.com/

禁止使用 URL 模式

以下 curl 请求将从缓存中删除产品 10 的所有 object,对于所有用户:

curl -XPURGE -H "x-invalidate-pattern: ^/[0-9]+/10/?$" http://example.com/

结论

只要你的VCL足够灵活,你可以使用各种机制和规则来使缓存失效。

如 VCL 示例中所述,请通过 ACL 保护对内容失效的访问。您还可以添加额外的保护,例如密码身份验证或防火墙。