У меня есть экземпляр 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, когда она работала раньше.