Как скрыть админку WordPress с помощью Nginx
Админка WordPress, как известно, находится по адресу:
domain.ru/wp-login.php И конечно привлекает внимание различных ботов, пытающихся подобрать пароль и создающих ненужную нагрузку на сервере. Чтобы защитить админку WordPress от этого варварства можно ее скрыть и тогда боты не будут знать, куда посылать свои запросы.
Раньше админка у меня была скрыта с помощью WordPress плагина, который записывал правила для вебсервера Apache, и админке можно было задать, например, такой адрес: domain.ru/privet/ При этом при попытке зайти по старому адресу происходил редирект к domain.ru
Настраивая свой новый VDS-сервер, я решил наконец отказаться от использования Apache в качестве бекэнда в пользу PHP-FPM в связке с Nginx. И чтобы скрыть админку WordPress на новом сервере, пришлось искать другое решение. Мне хотелось получить функционал того плагина при этом не трогая WordPress вообще, обойтись только силами Nginx.
Поизучав Nginx я написал конфигурацию, которая:
- умеет менять адрес входа в админку WordPress на заданный;
- умеет правильно разлогиниваться из админки;
- при попытке зайти по традиционному адресу для входа происходит редирект на несуществующую страницу.
Единственный минус проявляется, когда WordPress разлогинивается по истечению срока сессии и выдает форму для ввода пароля поверх открытой в админке страницы. У меня он ее не выдает. Чтобы заново залогиниться нужно будет снова открыть страницу: domain.ru/privet/ В принципе происходит так довольно редко и меня это устроило.
Надо отметить, что Nginx непрост в конфигурировании, и не всегда очевиден с точки зрения программирования, хотя это полностью оправдано, тем, что удобство конфигурирования здесь принесено в жертву быстродействию.
В конфигурационный файл домена /etc/nginx/conf.d/domain.conf до блока обработки php файлов, который обычно начинается строкой
location ~ \.php$ {
нужно добавить такой кусок кода:
# новый адрес админки privet можно заменить на что-то свое location = /privet/ { # делаем редирект (секретный параметр abc123 лучше заменить на произвольную # длинную строку из букв и цифр, здесь и далее domain.ru меняем на свой домен) rewrite ^ http://domain.ru/wp-login.php?p=abc123 last; } # при запросе файла wp-login.php выполнять вложенный код location ~ ^/wp-login\.php { set $b "B"; # проверка на отсутствие в запросе на вход секретного параметра # (abc123 меняем на тот же что и в начале) if ($args !~ "p=abc123") { set $b "D"; } set $y "Y"; # проверка на отсутствие в запросе на вход секретного параметра в referer # (abc123 меняем на тот же что и в начале) if ($http_referer !~ "p=abc123") { set $y "U"; } set $x "X"; # обработка запроса на выход (разлогинивания) из админки WordPress if ($args ~ "action=logout") { set $x "I"; } set $w "W"; # проверка, если запрос на выход пришел не с нашего сервера if ($http_referer !~ "domain.ru/wp-admin/") { set $w "V"; } # устраним конфликт между проверками запросов на вход и на выход if ($x = "I") { set $b "B"; } set $mm $b$y; set $nn $x$w; # если в запросе на вход нет секретного параметра, то отправим на несуществующую страницу if ($mm = "DU") { rewrite ^ http://domain.ru/404/ last; } # если запрос на выход пришел не с нашего сервера, то выдадим страницу 404 if ($nn = "IV") { return 404; } # все дошедшие до сюда запросы считаются верными и передаются на обработку в PHP-FPM # папка где лежит WordPress root /web/domain.ru/www/; # путь к сокету PHP-FPM для отработки PHP-скрипта fastcgi_pass unix:/var/run/php-fpm/php7.2-fpm-domain.sock; # включить параметры fastcgi include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
После внесения изменений в конфигурацию не забудьте перезапустить Nginx:
systemctl restart nginx
Поделиться статьей: