【问题标题】:Varnish purge using HTTP and REGEX使用 HTTP 和 REGEX 清除清漆
【发布时间】:2012-06-22 14:28:36
【问题描述】:

我想使用 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

这样我想在上传新图片后清除此图片的所有缩放版本。有什么办法吗?

【问题讨论】:

    标签: curl varnish purge


    【解决方案1】:

    试试这个:

    如果清漆 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";
    
        }
    

    【讨论】:

    • 如果您的正则表达式中有编码在 url 中的字符,请使用 @Egidijus 解决方案
    【解决方案2】:

    首先定义谁可以使用清除的白名单,然后在您的 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 是您的 varnish 服务器的地址。

    【讨论】:

      【解决方案3】:

      当然有。

      在 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);
               }
      

      【讨论】:

        【解决方案4】:
        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";
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2014-01-08
          • 2011-08-31
          • 2013-07-16
          • 2017-05-19
          • 2014-10-16
          • 1970-01-01
          • 2017-07-21
          • 2018-04-07
          • 2012-07-20
          相关资源
          最近更新 更多