Как скрыть админку 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

Поделиться статьей:  

Поделитесь своим мнением

Правила сообщений

Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Копирование материалов разрешено только с указанием источника и прямой индексируемой ссылкой на оригинал.
Яндекс.Метрика
© 2018 Хороший отзыв · Искусство выбирать · Лично · Разумно · Честно