Назад | Перейти на главную страницу

Составная фильтрация URL-адресов Varnish с параметрами запроса

У меня есть экземпляр WordPress с Varnish, в котором я заблокировал доступ к wp-login.php через VCL, используя:

sub vcl_recv {
    # block outside access to login
    if (req.url ~ "wp-admin" && !client.ip ~ white_list) {
        return (synth(404, "Page not found"));
    }
 }    

Для справки, white_list это просто включенный файл со списком IP-адресов из белого списка. На данный момент это сработало очень хорошо.

Мой клиент недавно попросил использовать защищенные страницы WordPress для страницы, защищенной псевдопаролем. Я обнаружил, что этот метод использует /wp-login.php?action=postpass для проверки пароля. Из-за моего белого списка wp-login.php некоторые (не все, что странно) запросы возвращаются как 404.

Это означает, что все запросы к /wp-login.php?action=postpass должны быть переданы, и все запросы к wp-login.php в котором запрашивающий IP-адрес не соответствует white_list следует отрицать. Я начал с:

sub vcl_recv {
    # allow wp protected pages
    if (req.url ~ "wp-login" && req.url ~ "\?action\=postpass$") {
      return(pass);
    } else if (req.url ~ "wp-(admin|login)" && !client.ip ~ white_list) {
       return(synth(404, "Page not found"));
    }
}

Мне кажется, это должно работать, но не работает. Как есть, это правило разрешает любой доступ к wp-login.php независимо от white_list. Я временно удалил && !client.ip ~ white_list чтобы сохранить блок, но я не понимаю, почему эта часть условного выражения будет оцениваться в false, когда она работала раньше.