15

我想使用 HTTP 清除清漆的元素。这个 http 调用是从 varnish 本身后面的后端服务器触发的,因此后端服务器除了 HTTP 之外没有其他访问权限。

我已经使用相应的 ACL 实施了以下清除规则,这些规则适用于

curl -X PURGE http://www.example.com/image/123/photo-100-150.jpg

但我希望能够使用正则表达式通过 HTTP 清除 URL

curl -X PURGE http://www.example.com/image/123/*.jpg

这样,我想在上传新图像后清除该图像的所有缩放版本。有办法吗?

4

4 回答 4

13

试试这个:

如果清漆 3.0 及更高版本。

vcl_recv {
    if (req.request == "PURGE") {
             if (!client.ip ~purge){
                     error 405 "Not allowed";
             }
     ban("req.http.host == " +req.http.host+" && req.url ~ "+req.url);
     error 200 "Ban added";

    }
于 2012-07-06T04:06:45.867 回答
7

首先定义谁可以使用清除的白名单,然后在您的 VCL 中添加清除器节。

acl purge {
"127.0.0.1";
"10.22.0.0"/16;
}


sub vcl_recv {


if (req.http.X-Purge-Regex) {
        if (!client.ip ~ purge) {
            error 405 "Varnish says nope, not allowed.";
        }
        ban_url(req.http.X-Purge-Regex);
        error 200 "The URL has been Banned.";
}

Varnish 将使用标头的值X-Purge-Regex来创建禁令。

所以你可以禁止这样的事情:

curl -v -X PURGE -H 'X-Purge-Regex: ^/assets/*.css' varnishserver:6081

或者

curl -v -X PURGE -H 'X-Purge-Regex: ^/images/*' varnishserver:6081

varnishserver是您的清漆服务器的地址。

于 2015-11-17T16:52:42.387 回答
0

当然有。

在 VCL 中,您想使用 ban 方法 - 记录在“man vcl”中。它对传入的请求创建一个过滤器。如果你打算以每秒 2 次以上的速度使用它,我建议你用谷歌搜索“ban luker friendly”并相应地重写表达式。

未经测试的代码:

sub vcl_recv {
         if (req.method == "PURGERE" and client.ip ~ admin_network) {
            ban("req.http.host == " + req.http.host + " && req.url == " + req.url);
         }
于 2012-06-25T11:56:42.127 回答
0
acl purge {
"127.0.0.1";
}

sub vcl_recv {
    if (req.request == "PURGE") {
        if (!client.ip ~ purge) {
            error 405 "IP:" + client.ip + " Not allowed.";
        }
        ban("req.http.host == " + req.http.host + " && req.url ~ " + req.url);
        error 200 "host:" + req.http.host + " url:" + req.url + " Ban added";
    }
}
于 2015-04-14T04:08:22.340 回答