Очистка Varnish с использованием HTTP и REGEX

Я хочу очистить элементы от лака с помощью HTTP. Этот HTTP-вызов запускается с внутреннего сервера за самим лаком, поэтому у внутреннего сервера нет другого доступа, кроме HTTP.

Я реализовал следующие правила очистки с соответствующим ACL, которые отлично работают для

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

но я хочу иметь возможность очищать URL-адрес через HTTP с помощью Regex

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

Таким образом, я хочу очистить всю масштабированную версию этого изображения после загрузки новой. Есть ли способ?


person MatthiasLaug    schedule 20.06.2012    source источник


Ответы (3)


попробуй это:

если лак 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";

    }
person mk_    schedule 06.07.2012
comment
Используйте решение @Egidijus, если в вашем регулярном выражении есть символы, закодированные в URL-адресе. - person Baschdl; 08.01.2021

Сначала определите белый список тех, кто может использовать очистку, а затем добавьте раздел очистки в свой 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

or

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

varnishserver — это адрес вашего лакового сервера.

person Egidijus    schedule 17.11.2015

Конечно есть.

В VCL вы хотите использовать метод бана, описанный в "man vcl". Он создает фильтр для входящих запросов. Если вы собираетесь использовать это со скоростью более 2 раз в секунду, я рекомендую вам погуглить «запретить 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);
         }
person perbu    schedule 25.06.2012