Если вы сменили структуру ссылок, удалили страницу или перенесли материал на новый адрес, старый URL лучше сразу отправить на новый через редирект 301. Это сохраняет трафик, не ломает закладки и помогает поисковым системам понять, что страница переехала навсегда. Без плагина такой редирект обычно настраивают на уровне веб-сервера или, в крайнем случае, через PHP в WordPress.
Самый надёжный вариант зависит от того, что у вас под капотом: Apache, Nginx или доступ только к файлам темы. Ниже — рабочие способы и моменты, из-за которых редирект часто не срабатывает.
Что такое редирект 301 и когда он нужен
Код ответа 301 означает постоянное перенаправление. Браузер и поисковый робот получают сигнал: старый адрес больше не основной, нужно идти на новый. Это не то же самое, что 302, который используют для временного переноса.
301 нужен в типичных ситуациях:
- изменили структуру постоянных ссылок в WordPress;
- удалили страницу, но есть подходящая замена;
- объединили несколько материалов в один;
- перенесли сайт на новый домен или в новую папку;
- исправили URL с ошибкой, опечаткой или лишним слэшем.
Если страница удалена без замены, редирект на главную — не лучший вариант. Для поисковика это часто выглядит как мягкая ошибка, а не как логичное продолжение старого адреса. В таких случаях лучше вести на наиболее близкий по смыслу раздел или оставить 404, если замены нет.
Самый правильный способ: настроить редирект на уровне сервера
Если есть доступ к конфигурации веб-сервера, редирект лучше делать там. Так он срабатывает раньше WordPress, не нагружает PHP и работает даже тогда, когда сама CMS временно недоступна.
Apache: редирект через .htaccess
На большинстве хостингов с Apache или LiteSpeed достаточно файла .htaccess в корне сайта. Перед правкой обязательно сделайте копию файла: ошибка в синтаксисе может привести к 500 Internal Server Error.
Для перенаправления одной страницы на другую добавьте правило выше стандартного блока WordPress:
Redirect 301 /staryj-url/ https://wpcource.ru/novyj-url/Если нужен более гибкий вариант, можно использовать mod_rewrite:
RewriteEngine On
RewriteRule ^staryj-url/?$ https://wpcource.ru/novyj-url/ [R=301,L]Первый вариант проще и подходит для одиночных редиректов. Второй удобнее, если нужно учитывать слэш в конце или строить более сложные правила.
Если вы редиректите старый домен или старую папку целиком, правило будет другим. Например, для переноса всего сайта на новый домен:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^staryj-domen\.ru$ [NC]
RewriteRule ^(.*)$ https://novyj-domen.ru/$1 [R=301,L]Здесь важно сохранить путь после домена, чтобы все внутренние URL тоже переехали.
Nginx: редирект в конфигурации сервера
На Nginx файл .htaccess не работает. Редирект нужно прописывать в конфигурации сайта, обычно в блоке server. Если у вас обычный shared-хостинг, доступ к этому файлу может быть закрыт — тогда придётся обращаться в поддержку.
Для одной страницы:
location = /staryj-url/ {
return 301 https://wpcource.ru/novyj-url/;
}Для переноса всего сайта на новый домен:
server {
server_name staryj-domen.ru www.staryj-domen.ru;
return 301 https://novyj-domen.ru$request_uri;
}После изменения конфигурации Nginx обычно требуется перезагрузка или перечитывание настроек. На управляемом хостинге это делает провайдер, на своём сервере — администратор.
Если доступа к серверу нет: редирект через functions.php
Когда вы не можете править настройки Apache или Nginx, можно сделать редирект на уровне WordPress. Это рабочий вариант, но он менее надёжный: код выполнится только после загрузки WordPress и не сработает, если сайт падает раньше.
Добавьте код в functions.php дочерней темы или в собственный мини-плагин. В родительскую тему правки лучше не вносить: после обновления они пропадут.
add_action('template_redirect', function () {
if (is_page('staryj-url')) {
wp_redirect('https://wpcource.ru/novyj-url/', 301);
exit;
}
});Здесь is_page('staryj-url') проверяет страницу по слагу. Вместо него можно использовать ID, если страница уже переименована и слаг меняется:
add_action('template_redirect', function () {
if (is_page(123)) {
wp_redirect('https://wpcource.ru/novyj-url/', 301);
exit;
}
});Для записей и других типов контента используются похожие условные теги, но логика та же: сначала проверка, затем wp_redirect(), после неё обязательно exit. Без exit WordPress продолжит вывод страницы, и поведение может стать непредсказуемым.
Как проверить, что редирект работает
После настройки не ограничивайтесь открытием ссылки в браузере. Браузер может показать старую страницу из кэша, и это создаёт ложное ощущение, что всё в порядке.
Проверяйте так:
- откройте старый URL в режиме инкогнито;
- посмотрите код ответа через инструменты разработчика в браузере;
- если есть доступ к терминалу, выполните
curl -I https://wpcource.ru/staryj-url/; - убедитесь, что в ответе есть
HTTP/1.1 301илиHTTP/2 301, а в заголовкеLocationуказан новый адрес.
Если видите 200 вместо 301, значит редирект не сработал. Если видите цепочку из нескольких переходов, лучше сократить её до одного шага: старый URL должен вести сразу на конечный адрес, без промежуточных страниц.
Почему редирект 301 может не срабатывать
На практике проблема почти всегда в одной из нескольких причин.
- Правило стоит не там. В
.htaccessредирект должен быть выше блока WordPress, иначе CMS может перехватить запрос раньше. - Неправильный синтаксис. Одна лишняя кавычка, слэш или символ в регулярном выражении ломают правило.
- Кэш мешает проверке. Страница может открываться из браузерного, серверного или плагинного кэша.
- Редирект конфликтует с другим правилом. Например, одно правило ведёт на www, другое — без www, и получается петля.
- Используется не тот тип сервера. Правила Apache не работают на Nginx, а Nginx не читает
.htaccess. - В WordPress уже есть похожая логика. Некоторые темы и плагины автоматически исправляют URL, добавляют слэш или перенаправляют вложения.
Если редирект нужен для конкретной страницы, сначала проверьте, не создаёт ли WordPress автоматический canonical-редирект. Иногда кажется, что ваше правило не работает, хотя на самом деле срабатывает другое перенаправление.
Что выбрать в реальной задаче
Если у вас есть доступ к серверу, делайте редирект там. Это самый чистый и предсказуемый вариант. Для одной-двух страниц на Apache подойдёт .htaccess. На Nginx — конфигурация сервера. Если доступ к серверу закрыт, используйте functions.php дочерней темы или отдельный мини-плагин.
Коротко по выбору:
| Способ | Когда подходит | Минус |
|---|---|---|
.htaccess | Apache/LiteSpeed, есть доступ к файлу | Любая ошибка ломает обработку запросов |
| Конфиг Nginx | Есть доступ к серверу или поддержка хостинга | Не редактируется через WordPress |
functions.php | Нет доступа к серверу, нужен быстрый точечный редирект | Зависит от работы WordPress и темы |
Если редиректов становится много, лучше вынести их в серверную конфигурацию или отдельный мини-плагин, а не держать в теме. Иначе при смене шаблона вы потеряете все правила сразу.
Для единичной задачи — перенаправить старый URL на новый без плагина — этого достаточно. Главное не смешивать способы в одном месте и после правки сразу проверять ответ сервера, а не только визуальное поведение страницы.