Как перенаправить/переписать все запросы /wp-login
Есть ли простой способ настроить WordPress, PHP или Apache для переписывания всех URL, содержащих /wp-admin на /admin?
Я добавил следующую запись в файл .htaccess:
RewriteRule ^admin /wp-login.php [L]
Хотя domain.com/admin правильно показывает страницу входа, все страницы после авторизации отображают URL как /wp-admin, а я хочу, чтобы всегда отображалось /admin.
Есть ли какие-то мысли по этому поводу?
Чтобы ответить на ваш вопрос о настройке URL-адресов в Apache через mod_rewrite (модуль Apache для перезаписи URL), может быть полезно следующее:
RewriteRule ^admin/(.*)$ /wp-admin/$1 [QSA,L]
(непроверенная директива конфигурации, сверьтесь с документацией, если возникнут ошибки)
Это правило преобразует любой запрос к /admin/... в /wp-admin/... .
Если это единственное, что вам нужно знать, должен отметить, что этот вопрос немного выходит за рамки тематики worpdress@se, так как фактически это вопрос о настройке веб-сервера Apache. Лучшим местом для такого вопроса может быть serverfault.
Имейте в виду, что это правило только перезаписывает запрашиваемые URL-адреса. WordPress ничего не знает об этом и по-прежнему выводит ссылки на /wp-admin/ в админке. Для перезаписи этих URL существует специальный хук:
return apply_filters('admin_url', $url, $path, $blog_id);
Вам нужно будет заменить часть domain/wp-admin/ на domain/admin/ с помощью своего фильтра.
@hakre -- Спасибо, это практически именно то, что я искал. Область, с которой я менее знаком, это аспект apply_filters. Я предполагаю, что это нужно разместить в файле functions.php ближе к началу, верно? Не могли бы вы привести пример этой строки WordPress, которая автоматически изменит все запросы /wp-admin/(.*) на /admin/(.*)?
NetConstructor.com
Это немного сложнее, так как требует дополнительных настроек. Я создал must-use плагин для примера: https://gist.github.com/701245#file_change_admin_url.php
hakre
@hakre -- Я попробовал код, который вы разместили на GitHub, но он, кажется, не сработал для меня. По какой-то странной причине я даже не смог увидеть плагин. Я заметил, что вы сказали разместить его в папке mu-plugins, но я предполагаю, что размещение в обычной папке plugins (без mu) тоже должно работать (даже если вы изменили имя папки плагина (определено через wp-config файл)?
NetConstructor.com
Если файл создан и правильно размещен в папке must use плагинов, вы должны увидеть его имя в списке под вкладкой "Must Use" в разделе Плагины: http://tinypic.com/view.php?pic=2h4mclc&s=7 - В противном случае неудивительно, что он не работает. Сначала убедитесь, что он там. Не забудьте также настроить файл .htaccess.
hakre
@Rarst -- Я снова вернулся к этому и заметил, что на самом деле я сам делал что-то не так. Как только я поместил код в mu-plugins, он заработал! Два уточняющих вопроса, пожалуйста... как я могу изменить ваш код, чтобы просто записать его в файл functions.php? И второй вопрос... как сделать так, чтобы все запросы к /wp-admin, /wp-admin/index.php и /wp-login.php выдавали ошибку 404? Моя цель — сделать так, чтобы только /admin или /admin/index.php предоставляли пользователю страницу входа, а все остальные выдавали ошибку.
NetConstructor.com
Вы можете попробовать поместить файл рядом с вашим function.php и подключить его в начале function.php. Но это может не сработать, потому что к тому моменту может быть уже слишком поздно перенастраивать куки. Так что вы предупреждены :)
hakre
По вопросу 404 ошибки, пожалуйста, спросите на serverfault, как можно выполнить эту конфигурацию на вашем веб-сервере.
hakre
Куда именно вставить строку "RewriteRule ^admin/(.*)$ /wp-admin/$1 [QSA,L]" ???
trusktr
Куда мне следует вставить код return apply_filters('admin_url', $url, $path, $blog_id);
User
hakre.... Отличный ответ... теперь в последней версии WordPress есть отдельная сетевая администрация, я использовал ваше решение и добавил часть для правильной перезаписи ссылок "Network Admin" таким же образом...
/**
* Изменение URL админки
*
* Copyright (C) 2010 hakre <http://hakre.wordpress.com/>
*
* Эта программа является свободным программным обеспечением: вы можете распространять и/или изменять
* ее на условиях GNU Affero General Public License, опубликованной
* Free Software Foundation, либо версии 3 лицензии, либо
* (по вашему выбору) любой более поздней версии.
*
* Эта программа распространяется в надежде, что она будет полезной,
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
* ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ.
* Подробнее см. в GNU Affero General Public License.
*
* Вы должны были получить копию GNU Affero General Public License
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
*
* ИСПОЛЬЗОВАНИЕ:
*
* Скопируйте файл в директорию wp-content/mu-plugins и добавьте
* следующее правило RewriteRule в конфигурацию Apache или .htaccess:
*
* RewriteRule ^admin/(.*)$ wp-admin/$1 [QSA,L]
*
* Оно изменит URL админки WordPress
*
* с: http://example.com/wp-admin/ ...
* на: http://example.com/admin/ ...
*
* @author hakre <http://hakre.wordpress.com>
* @see http://wordpress.stackexchange.com/questions/4037/how-to-redirect-rewrite-all-wp-login-requests/4063
* @todo mod_rewrite_rules - фильтр для вставки в .htaccess при активации плагина
*
*/
/** Обновленная версия от Mark Figueredo, <http://gruvii.com/> **/
return ChangeAdminUrlPlugin::bootstrap();
class ChangeAdminUrlPlugin {
private $renameFrom = 'wp-admin';
private $renameTo = 'admin';
static $instance;
static public function bootstrap() {
null === self::$instance
&& self::$instance = new self()
;
return self::$instance;
}
private function setCookiePath() {
defined('SITECOOKIEPATH') || define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) );
defined('ADMIN_COOKIE_PATH') || define('ADMIN_COOKIE_PATH', SITECOOKIEPATH . $this->renameTo);
}
public function __construct() {
$this->setCookiePath();
add_action('init', array($this, 'init')) ;
}
public function init() {
add_filter('admin_url', array($this, 'admin_url'), 10, 3);
add_filter('network_admin_url', array($this, 'network_admin_url'), 10, 3);//Добавлено Mark Figueredo, <http://gruvii.com/>
}
public function admin_url($url, $path, $blog_id) {
$renameFrom = $this->renameFrom;
$renameTo = $this->renameTo;
$scheme = 'admin';
$find = get_site_url($blog_id, $renameFrom.'/', $scheme);
$replace = get_site_url($blog_id, $renameTo.'/', $scheme);
(0 === strpos($url, $find))
&& $url = $replace.substr($url, strlen($find))
;
return $url;
}
// Добавлено Mark Figueredo, <http://gruvii.com/>
public function network_admin_url($url, $path) {
$renameFrom = $this->renameFrom;
$renameTo = $this->renameTo;
$scheme = 'admin';
$find = network_site_url($renameFrom.'/', $scheme);
$replace = network_site_url($renameTo.'/', $scheme);
(0 === strpos($url, $find))
&& $url = $replace.substr($url, strlen($find))
;
return $url;
}
}
Вы сталкивались с какими-либо проблемами при использовании этого кода? Я заметил, что страницы стали загружаться дольше в админке, а некоторые плагины начали работать странно...
NetConstructor.com
Привет! Сейчас нашел этот пост, когда искал решение для замены 'wp-'. Может кто-нибудь сказать, есть ли проблемы с использованием этого кода, как упомянул @Netcontrucor.com?
Спасибо!
user391
Похоже, ваш код не работает, если WordPress установлен на поддомене, так как он пытается перенаправить на основной домен. Можете подтвердить это и, если это так, обновить код? Спасибо, CH
NetConstructor.com
Пожалуйста, добавьте URL поддоменов и т.д., иначе сложно сказать // Могу предположить, что cookies не работают должным образом при смене доменов в текущем коде.
hakre
Привет, куда именно в htaccess нужно поместить RewriteRule относительно других правил WordPress?... Имеет ли это значение?
trusktr
Можете добавить строки .htaccess для симлинков в ответ для справки? Возможно, у вас есть что-то подобное, требующее добавления строки с -l: http://stackoverflow.com/questions/5412955/htaccess-config-with-symbolic-links-and-index-files-not-working-as-expected ?
majick
В дополнение к предыдущим решениям. Я нашел недостающие файлы CSS и скриптов.
Исправление выглядит так:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# загруженные файлы
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
# добавление слеша в конец /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
# Исправление с использованием предыдущего ответа.
RewriteRule ^admin/(.*)$ wp-admin/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
# Исправление для загрузки файлов CSS, JS и изображений для URL админки мультисайта.
# старый код RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.(php|css|js|png|jpg|gif))$ $1 [L]
RewriteRule . index.php [L]