Если вы сменили структуру URL, удалили страницы или объединили несколько материалов в один, старые адреса нельзя просто оставить как есть. Пользователь увидит 404, а поисковики потеряют связь между старой и новой страницей. В таких случаях нужен 301-редирект: он сообщает браузеру и роботам, что страница переехала навсегда, и передаёт большую часть накопленных сигналов на новый адрес.
В WordPress это можно настроить без плагинов. Обычно выбирают один из трёх способов: через файл .htaccess на Apache, через конфигурацию Nginx или через PHP-код в теме, если нужно закрыть точечный случай. Самый надёжный вариант для массовых перенаправлений — серверный уровень. PHP-редиректы стоит использовать только там, где без них не обойтись.
Когда редирект 301 действительно нужен
301 ставят не «на всякий случай», а когда старый адрес больше не должен открываться как самостоятельная страница. Типичные ситуации:
- изменили структуру постоянных ссылок в WordPress;
- удалили страницу, но есть её новый аналог;
- объединили несколько статей в одну и хотите сохранить трафик со старых URL;
- переименовали разделы или перенесли контент в другую рубрику;
- исправили дубли с разными вариантами адреса.
Если страница удалена без замены и ей некуда вести, редирект не нужен. В таком случае лучше отдавать 410 Gone или оставить 404, если это осознанное удаление без аналога. 301 имеет смысл только тогда, когда есть релевантная новая цель.
Самый правильный способ: редирект на уровне сервера
Для WordPress это предпочтительный вариант, потому что перенаправление срабатывает до загрузки самой CMS. Это быстрее и надёжнее, чем обработка через PHP. Но способ зависит от веб-сервера.
Apache: правила в .htaccess
Если сайт работает на Apache или LiteSpeed с поддержкой .htaccess, редиректы обычно добавляют в корневой файл сайта. Перед изменением сделайте копию файла: ошибка в синтаксисе может временно сломать доступ к сайту.
Для одного адреса на другой используйте правило такого вида:
Redirect 301 /staryj-url/ https://example.com/novyj-url/Это самый простой вариант. Он подходит, когда нужно перенаправить конкретный путь внутри сайта. Если хотите более гибкое правило, используйте модуль mod_rewrite:
RewriteEngine On
RewriteRule ^staryj-url/?$ https://example.com/novyj-url/ [R=301,L]Здесь важно несколько моментов. Во-первых, путь указывается без домена и без начального слэша. Во-вторых, флаг [R=301,L] означает постоянный редирект и остановку обработки правила после совпадения. В-третьих, если у вас уже есть блок WordPress с правилами пермалинков, добавляйте свои перенаправления выше стандартного блока, чтобы они срабатывали раньше.
Если нужно перенаправить весь старый раздел на новый, правило может выглядеть так:
RewriteRule ^category-old/(.*)$ https://example.com/category-new/$1 [R=301,L]Такой вариант сохраняет хвост URL. Он полезен, когда структура внутри раздела совпадает или почти совпадает.
Nginx: редирект в конфигурации сайта
На Nginx .htaccess не работает. Правила нужно добавлять в конфигурацию виртуального хоста или в отдельный include-файл, если так устроен ваш хостинг. После изменения конфигурации обычно требуется перезагрузка или перечитывание Nginx.
Для одного адреса подойдёт такой вариант:
location = /staryj-url/ {
return 301 https://example.com/novyj-url/;
}Если нужен редирект для группы URL, можно использовать регулярное выражение:
rewrite ^/staryj-razdel/(.*)$ https://example.com/novyj-razdel/$1 permanent;В Nginx лучше использовать return 301 там, где совпадение точное, и rewrite только для более сложных шаблонов. Это проще читать и обычно быстрее в исполнении.
Если серверный доступ ограничен: редирект через functions.php
Иногда у владельца сайта нет доступа к настройкам Apache или Nginx, а редирект нужен срочно и точечно. Тогда можно добавить его в файл functions.php активной темы или, что безопаснее, в дочернюю тему. Этот способ работает через PHP и зависит от того, как быстро WordPress загружает тему, поэтому он менее предпочтителен, чем серверный редирект.
Для одного старого адреса используйте такой код:
add_action('template_redirect', function () {
if (is_page('staryj-url')) {
wp_redirect('https://example.com/novyj-url/', 301);
exit;
}
});Функция wp_redirect() — штатный механизм WordPress. После неё обязательно нужен exit, иначе выполнение скрипта может продолжиться и вызвать лишний вывод. Хук template_redirect подходит для таких задач, потому что срабатывает до вывода шаблона.
Если нужно перенаправить конкретный путь, а не страницу по слагу, можно проверить $_SERVER['REQUEST_URI']. Но здесь легко ошибиться с условиями и случайно задеть лишние адреса, поэтому такой код стоит использовать только если вы понимаете, что именно сравниваете.
Этот способ удобен для небольшого числа правил, но не для сотен перенаправлений. Большой список редиректов в PHP будет сложнее поддерживать и тестировать, чем правила на сервере.
Как не сломать сайт при настройке редиректов
Главная ошибка — делать цепочки редиректов. Например, старый адрес ведёт на промежуточный, а тот уже на финальный. Для пользователя это почти незаметно, но для скорости и индексации это лишний шаг. Старайтесь сразу вести старый URL на конечную страницу.
Ещё одна частая проблема — редирект на нерелевантную страницу. Если статья про один товар была удалена, не стоит отправлять её на главную только потому, что так проще. Лучше выбрать ближайший по смыслу материал или раздел. Поисковые системы лучше воспринимают перенаправление, когда новая страница действительно заменяет старую.
Не путайте 301 и 302. Временный редирект не подходит для постоянного переезда. Если поставить 302 там, где нужен 301, поисковики могут дольше держать старый адрес в индексе и не передать сигнал переезда так, как вы ожидаете.
Если у вас включён кэш на сайте или на сервере, после изменений очистите кэш. Иначе вы можете проверять уже старое поведение, а не актуальное правило.
Как проверить, что редирект работает
После настройки откройте старый URL в браузере и убедитесь, что он сразу открывает новый адрес. Но визуальной проверки мало: браузер может скрывать детали, а кэш иногда мешает увидеть реальный ответ сервера.
Надёжнее проверить HTTP-ответ. Если у вас есть доступ к терминалу, используйте curl:
curl -I https://example.com/staryj-url/В ответе должен быть статус 301 Moved Permanently и заголовок Location с новым адресом. Если видите несколько последовательных ответов, значит есть цепочка редиректов.
Ещё один практичный способ — открыть старый адрес в инструментах разработчика браузера и посмотреть вкладку Network. Там видно, какой код ответа вернулся и куда именно ушёл запрос.
Что выбрать в реальной работе
| Способ | Когда подходит | Что учесть |
|---|---|---|
.htaccess | Apache/LiteSpeed, доступ к корню сайта есть | Нужно аккуратно править синтаксис, иначе сайт может перестать открываться |
| Nginx | Сайт на Nginx и есть доступ к конфигу | Изменения делаются не в WordPress, а на уровне сервера |
functions.php | Нет доступа к серверной конфигурации, нужен один-два редиректа | Менее надёжно и медленнее, чем серверный вариант |
Если у вас обычный сайт на WordPress и редиректов немного, начните с серверного уровня. Если доступ к серверу ограничен, временно можно использовать PHP-редирект в теме, но потом лучше перенести правило в конфигурацию веб-сервера. Так проще сопровождать сайт и меньше риск, что смена темы сломает перенаправление.
Когда редиректы уже настроены, проверьте несколько старых адресов вручную и через curl. Если всё ведёт сразу на нужные страницы с кодом 301, задача решена: старые ссылки не теряют трафик, а поисковики получают понятный сигнал о переезде контента.