Как переместить страницу входа wp-admin в другое место?
Вы можете отключить страницу wp-login через functions.php, добавив хук к login_head:
add_action( 'login_head', 'wp_die');
(это, очевидно, очень грубый способ сделать это, но он предотвращает возможность входа через эту страницу. Вместо просто завершения работы, вы можете сделать функцию перенаправления или вывода предупреждающего сообщения.)
И скопируйте существующий файл wp-login в другое место, не забудьте обновить относительный путь к wp-load.php
в начале файла (а также любые другие относительные пути, которые могут там быть, включая ссылки на сам файл и действия форм).
(Очевидно, вам придётся удалить добавленный вами action для login_head
, иначе вы не сможете войти и с этой страницы.)
Затем вам просто нужно добавить фильтр к login_url
, который будет возвращать адрес вашей новой страницы входа. Иначе запросы к файлам wp-admin будут перенаправляться на старую, теперь отключённую страницу входа.

Это не лучшая идея с точки зрения безопасности, потому что страница wp-login или wp-admin сама по себе не представляет угрозы. Хотя можно утверждать, что если у кого-то есть ваш пароль/имя пользователя, они могут не найти, куда входить, таким образом достигается безопасность через скрытность.
Как сказал kronus, вы могли бы сделать какие-нибудь хитрые перенаправления, но не уверен, насколько хорошо это будет работать в будущих версиях или стоит ли вообще заморачиваться. Лично я не думаю, что это того стоит, хотя я серьезно отношусь к безопасности.
Я бы предложил несколько лучших идей для вашей страницы входа.
Включите SSL для входа и админки (https).
Защитите свою страницу с помощью .htaccess (у вас будет двойная аутентификация).
Используйте плагин типа Limit Login Attempts, который блокирует пользователя после нескольких неудачных попыток входа.

Спасибо за ваши хорошие предложения, но я хочу переместить страницу входа в другое место.

Это абсолютно хорошая идея. Скрытие того факта, что ваш сайт работает на WordPress, отбивает у людей желание пытаться взломать основную структуру. Если бы я искал WordPress-блоги и попал на www.site.com/wp-login.php, а получил ошибку 404, я бы просто ушел, не пытаясь использовать известные уязвимости в PHP. Каждый элемент защиты делает ваш сайт немного более неуязвимым.

И какая известная уязвимость ядра? У вас их нет или вы о них не знаете, так что вы говорите ни о чем. Настоящие специалисты по безопасности защищают приложения, а не прячут их, это для детей.

Я не говорил об уязвимостях ядра. Для WordPress существует множество эксплойтов для плагинов, тем и т.д. Достаточно взглянуть на любой сайт, сообщающий об уязвимостях. Просматривая логи неудачных HTTP-запросов, я вижу, что сайты, которыми я управляю, постоянно подвергаются брутфорс-атакам и XSS-атакам, специально адаптированным под WordPress, каждый день. По вашей логике, также не стоит выносить wp-content
за пределы корневой папки, перемещать wp-config.php
выше корневой директории, убирать надпись "powered by wordpress" в подвале страницы, изменять префикс таблиц wp_
по умолчанию или удалять стандартную учётную запись администратора. Изменение настроек по умолчанию и есть обеспечение безопасности, и страница входа — не исключение.

Ни один из этих ответов не был особенно полезным. Я сомневаюсь в мотивах автора вопроса, но вот как это сделать. Добавьте это в ваш functions.php, но не забудьте заменить "$login_page_id":
// Это перенаправит стандартную страницу входа на вашу новую страницу
add_action( 'login_redirect', 'custom_login_redirect' );
function custom_login_redirect()
{
if ( 'wp-login.php' == $GLOBALS['pagenow'] )
{
// Укажите ваш $login_page_id
wp_redirect( get_permalink($login_page_id) );
die;
}
}
// Это заменит URL входа, используемый WordPress
add_filter( 'login_url', 'custom_login_url', 10, 2 );
public function custom_login_url( $login_url='', $redirect='' )
{
// Укажите ваш $login_page_id
return get_permalink($login_page_id);
}
На вашей новой странице входа вы можете просто добавить эту функцию для отображения формы входа:
<?php wp_login_form(); ?>

В итоге я создал плагин, который решает эту задачу. https://wordpress.org/plugins/sewn-in-template-log-in/

ОП, лучшее, что можно сделать в этом случае — это фильтрация по IP, разрешив доступ только тем сетям, которым разрешено входить в область WP-Admin (например, IP вашего офиса, разработчиков и т. д.).
## .htaccess внутри папки wp-admin
order deny,allow
deny from all
allow from xxx.xxx.xxx
allow from xxx.xxx.xxx
allow from xxx.xxx.xxx

За пять лет, что этот вопрос здесь находится, никто не затронул основную проблему: Безопасность через скрытность — это действительно эффективный метод для защиты от автоматизированных ботов и поддержания чистоты логов. Основная цель перемещения/скрытия wp-admin
заключается в том, чтобы боты воспринимали сайт как не WordPress.
Мой способ скрытия (но не перемещения) wp-admin
заключается в том, чтобы показывать ботам стандартную 404 страницу при попытке доступа к этому URL. Только доступ с моего домашнего IP-адреса позволяет успешно загрузить страницу wp-admin
. Этот метод создает у атакующего/бота впечатление, что wp-admin
не существует, при этом не нарушая работу ядра WordPress или плагинов, которые жестко прописывают путь к wp-admin
. Данный код в .htaccess
реализует эту логику:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^12\.34\.56\.78$
RewriteRule ^/?wp-admin - [R=404,L]
Естественно, при использовании кода замените 12.34.56.78
на ваш собственный IP-адрес. Не забудьте экранировать символы .
, так как IP-адрес интерпретируется как регулярное выражение.

Это не решение, поскольку у подавляющего большинства людей динамический IP, и я могу захотеть войти в админ-панель с телефона

@TheGodFather: Тогда обновите RewriteCond соответствующим образом

Я нашел решение для переноса входа в Wordpress с /login/
, /wp-admin/
или /wp-login.php
на /cms
, используя только правила перезаписи в .htaccess
.
Плагины не нужны!
Вставьте это в файл .htaccess в корне проекта:
<IfModule mod_rewrite.c>
# Перенос входа на /cms.
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$
RewriteCond %{HTTP_REFERER} !/cms(.*)$
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*) ./cms?message=wrong_login_path [R=302,L]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$
RewriteCond %{QUERY_STRING} !^cms=unlocked
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule ^(.*) ./cms?message=redirect_to_custom_login_path [R=302,L]
RewriteRule ^cms wp-login.php?cms=unlocked [L]
</IfModule>
Удачи!
Обновление:
Я улучшил некоторые правила, чтобы даже POST
-запросы к /wp-login.php вызывали 403 forbidden error
. Это поможет против ботов, которые пытаются войти в админку методом перебора. Оставляйте комментарии к этому посту, если у вас есть предложения по улучшению этих правил.

Просто создайте новые страницы входа в поддиректориях. Скопируйте существующую страницу wp-login в новую директорию в корне вашего сайта (например, "/login"), переименуйте её в index.php, добавьте WordPress bootstrap в начало страницы и модифицируйте её по своему усмотрению (темизация и т.д.).
Вам потребуется немного изменить стандартный код страницы входа, в основном заменяя жёстко прописанные ссылки и редиректы на "wp-login.php". Но если вы оставите все хуки и фильтры на месте, этот подход не нарушит интеграцию с плагинами. Обновления ядра WordPress также будут работать нормально, если только обновление не включает изменения самой страницы wp-login (что редко происходит в минорных версиях).
Таким же способом можно создать страницы пользовательских аккаунтов (я обычно размещаю их в директории "/profile"). После этого пользователям с ролью "подписчик" вообще не нужно будет заходить в wp-admin, и вы сможете защитить его с помощью htaccess-файла. Именно это даёт вам дополнительную безопасность, которую вы ищете. Только не забудьте добавить исключение в htaccess для файла admin-ajax, так как некоторые плагины используют его на фронтенде.
Уверен, что вы не найдёте решения исключительно с помощью плагинов. Но если найдёте - дайте нам знать!

Вы можете использовать этот плагин:
http://wordpress.org/extend/plugins/wp-login/
Вы можете просто создать страницу и указать плагину, что это страница входа. По сути, он просто перенаправляет wp-login.php на вашу "страницу". Так что любой бот, ищущий wp-login.php, будет перенаправлен на вашу "страницу".
Для защиты страницы входа от ботов следует использовать комбинацию cookie и .htaccess, так как большинство ботов не используют куки. Например, так:
RewriteCond %{HTTP_COOKIE} !^PHPSESSID=\w+ [OR]
RewriteCond %{HTTP_REFERER} !^https?://([^.]+\.)?example\.com/ [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule ^wp-(comments-post|login|register)\.php http://example\.com [R=301,L,NS]
В приведенном примере я использую PHP Session Cookie, так как это самый простой вариант для реализации.

Этот ответ является дополнением к ответу dotancohen, так как он неполный. Ответ dotancohen не учитывает wp-login.php
, что важно, если вы пытаетесь скрыть WordPress.
Вот как можно вернуть ошибку 404 для обоих wp-admin
и wp-login.php
:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^12\.34\.56\.78$
RewriteCond %{THE_REQUEST} \ /+wp-(admin|login)

Вы говорите о перезаписи URL с помощью .htaccess? Разве это не нарушает внутренние основные функции?

Ну... если сделать это правильно, ничего не должно сломаться. Прочитав ваш апдейт, я бы предложил переименовать (или переместить) ваши логин-файлы в другую директорию/путь. Что вы думаете насчёт этого? Другой поддомен? Или просто другой путь?

Чтобы изменить URL выхода (в админке), отредактируйте ваш файл functions.php:
add_filter( 'logout_url', 'custom_logout_url');
function custom_logout_url( $login_url)
{
// Заменяем стандартный wp-login на ваш файл выхода
$url = str_replace( 'wp-login', 'your_logout_file', $login_url );
return $url;
}

Я решил эту проблему, удалив три своих блога и изменив параметры limit-login на максимально возможные значения — 9999.
Что касается одного спамера с IP-адресом 208.91.199.94, который атаковал мою страницу входа 750 раз за последние два дня, я работаю над другими способами его устранения.
