Если вы перенесли страницу, поменяли адрес записи или хотите склеить дубли, 301 редирект нужен сразу: он отправляет пользователя и поисковый робот на новый URL и помогает сохранить накопленный трафик и сигналы страницы. Делать это можно без плагинов — на уровне WordPress, если нужен точечный редирект, или на уровне сервера, если переезд затрагивает много URL.
Самый важный момент здесь простой: чем ближе редирект к серверу, тем раньше он срабатывает и тем меньше лишней нагрузки получает WordPress. Но для отдельных страниц иногда удобнее обойтись кодом в теме или в небольшом mu-plugin. Ниже — рабочие варианты, которые реально используют на обычных сайтах WordPress.
Когда 301 редирект нужен, а когда лучше не спешить
301 — это постоянный редирект. Его ставят, когда старый адрес больше не должен использоваться как основной:
- страница переехала на новый URL;
- изменился слаг записи или страницы;
- нужно объединить два похожих адреса в один канонический;
- сайт переехал на новый домен или на HTTPS;
- нужно убрать дубли со слешем и без слеша, с www и без www, с index.php и без него.
Если адрес меняется временно, например на время акции или технических работ, 301 не подходит. В таких случаях используют 302 или 307. Если поставить 301 «на всякий случай», поисковики могут закрепить новый адрес как основной раньше, чем вы планировали.
Самый надёжный вариант: редирект на уровне сервера
Если у вас есть доступ к настройкам веб-сервера, это лучший способ. Такой редирект работает до загрузки WordPress, не зависит от темы и не ломается после обновлений.
Apache: редирект через .htaccess
На большинстве хостингов с Apache или LiteSpeed редиректы настраивают в файле .htaccess в корне сайта. Перед изменениями сделайте копию файла: ошибка в синтаксисе может уронить сайт с 500-й ошибкой.
Для одного адреса на другой можно добавить правило выше стандартного блока WordPress:
Redirect 301 /staryj-url/ https://example.com/novyj-url/Если нужен более гибкий вариант, используйте mod_rewrite:
RewriteEngine On
RewriteRule ^staryj-url/?$ https://example.com/novyj-url/ [R=301,L]Такой вариант удобен, когда нужно учитывать слеш в конце или сделать несколько правил подряд. Важно не дублировать одинаковые редиректы в разных местах файла, иначе можно получить цепочку или цикл.
Если вы переносите весь сайт с HTTP на HTTPS или на новый домен, правило обычно делают на уровне всего домена, а не по одной странице. Например, для переезда на HTTPS редирект лучше настраивать отдельно от WordPress, чтобы запросы сразу уходили на защищённую версию.
Nginx: редирект в конфигурации сервера
На Nginx файл .htaccess не работает, поэтому редирект задают в конфиге виртуального хоста. Обычно это доступно только на VPS, выделенном сервере или через поддержку хостинга.
Для одной страницы правило выглядит так:
location = /staryj-url/ {
return 301 https://example.com/novyj-url/;
}Если нужно перенаправить весь старый домен на новый, используют отдельный серверный блок или правило в существующем блоке server. После изменения конфигурации Nginx нужно проверить синтаксис и перезагрузить сервис. На практике это делают командами вроде nginx -t и последующим reload, но только если у вас есть доступ к серверу и вы понимаете, какой конфиг правите.
Для Nginx особенно важно не смешивать серверные редиректы с логикой WordPress. Если один и тот же URL обрабатывается и сервером, и PHP-кодом, можно получить лишний переход или бесконечный цикл.
Как сделать редирект внутри WordPress без плагина
Если доступа к серверу нет, а редирект нужен для нескольких адресов, можно добавить его в WordPress через файл functions.php дочерней темы. Это рабочий вариант, но он менее надёжен, чем серверный: код зависит от темы, а при ошибке в PHP сайт может перестать открываться.
Для одного старого URL на новый подойдёт такой код:
add_action('template_redirect', function () {
if (is_page('staryj-url')) {
wp_redirect('https://example.com/novyj-url/', 301);
exit;
}
});Здесь is_page('staryj-url') проверяет страницу по слагу. Вместо is_page() можно использовать is_single() для записи или is_singular(), если нужно точнее привязаться к типу контента.
Если редиректов несколько, лучше не раздувать functions.php десятком одинаковых блоков. Практичнее собрать карту перенаправлений в массив и обрабатывать её в одном месте:
add_action('template_redirect', function () {
$redirects = [
'staryj-url' => 'https://example.com/novyj-url/',
'drugoj-staryj-url' => 'https://example.com/drugoj-novyj-url/',
];
$path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
if (isset($redirects[$path])) {
wp_redirect($redirects[$path], 301);
exit;
}
});Такой подход удобен для небольшого количества правил. Но если редиректов много, серверная настройка всё равно будет лучше: WordPress не будет запускаться на каждом старом запросе.
Как не сломать сайт: типичные ошибки при 301 редиректах
Самая частая проблема — редирект на самого себя. Это происходит, когда старый и новый адрес совпадают после нормализации слеша, www или протокола. В браузере это выглядит как бесконечная переадресация, а в логах — как цикл.
Ещё одна частая ошибка — цепочка из нескольких переходов: старый URL ведёт на промежуточный, а тот уже на конечный. Для пользователя это почти незаметно, но поисковым роботам и браузеру такой маршрут не нужен. Если есть возможность, всегда ведите старый адрес сразу на финальный.
Отдельно проверьте такие вещи:
- не конфликтует ли правило с канонизацией WordPress и веб-сервера;
- не совпадает ли старый URL с реальной страницей на новом месте;
- не закрыт ли новый адрес в
noindexилиrobots.txt; - не меняется ли адрес из-за параметров, слеша или регистра.
Если на сайте уже есть кеширование на уровне хостинга, CDN или reverse proxy, после изменения редиректов очистите кеш. Иначе вы можете проверять старое поведение, хотя правило уже исправлено.
Как проверить, что редирект работает правильно
После настройки не ограничивайтесь открытием ссылки в браузере. Браузер может показать уже закешированный переход или скрыть детали ответа. Надёжнее проверить код ответа и заголовок Location.
Самый простой способ — открыть старый URL в режиме инкогнито и убедиться, что адрес меняется на нужный. Лучше дополнительно проверить ответ через инструменты разработчика, онлайн-проверку редиректов или команду curl с заголовками:
curl -I https://example.com/staryj-url/В ответе должен быть статус 301 Moved Permanently и заголовок Location с новым адресом. Если видите 302, значит редирект временный. Если видите 200, значит правило не сработало и запрос дошёл до страницы как обычно.
Для переноса большого количества URL полезно проверить несколько сценариев: со слешем и без него, с www и без www, HTTP и HTTPS, а также старые адреса с параметрами. Так вы быстрее заметите лишние цепочки и ошибки в правилах.
Что выбрать в реальной задаче
| Сценарий | Лучший способ | Почему |
|---|---|---|
| 1–5 отдельных страниц | functions.php или mu-plugin | Быстро, без доступа к серверу |
| Много старых URL | .htaccess или Nginx | Быстрее и надёжнее, чем PHP |
| Переезд домена или HTTPS | Серверный редирект | Срабатывает до WordPress и не создаёт лишней нагрузки |
| Нужно временное перенаправление | 302/307, не 301 | Постоянный редирект здесь не подходит |
Если у вас обычный сайт на общем хостинге, начните с проверки, можно ли редактировать .htaccess. Это самый практичный вариант для большинства задач. Если доступ к серверу закрыт, используйте код в дочерней теме, но только для небольшого числа правил и с резервной копией перед правкой.
В результате вам нужен не просто переход со старого адреса на новый, а аккуратная схема без цепочек, циклов и дублей. Тогда поисковики быстрее переиндексируют новый URL, а пользователи не потеряют страницу из выдачи и закладок.