Если вы меняете адрес страницы, удаляете старый материал или склеиваете дубли, 301 редирект нужен сразу. Он сообщает браузеру и поисковым системам, что страница переехала навсегда, и помогает сохранить часть трафика, ссылочный вес и поведенческие сигналы. В WordPress это можно сделать без плагинов — на уровне веб-сервера или через PHP, если доступ к конфигам ограничен.
Ниже — рабочие варианты для Apache, Nginx и самого WordPress, а также то, как не получить цепочку редиректов и лишние 404.
Когда 301 редирект действительно нужен
301 ставят не «на всякий случай», а когда старый URL больше не должен открываться как основной:
- страница получила новый адрес после редизайна или смены структуры;
- пост удалён, но есть близкая замена;
- две страницы дублируют друг друга и нужно оставить одну;
- товар, услуга или статья объединены в один материал;
- меняется домен, протокол или версия URL со слэшем/без слэша.
Если у страницы нет замены и контент действительно исчез навсегда, иногда корректнее вернуть 410 Gone, а не 301. Но если задача — сохранить переходы и передать пользователей на релевантную страницу, нужен именно 301.
Что выбрать: .htaccess, Nginx или PHP
Способ зависит от того, как устроен хостинг. В WordPress чаще всего сайт работает на Apache или Nginx, реже — на связке Nginx как прокси и Apache как backend.
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
.htaccess | Apache, общий хостинг | Быстро, не требует плагинов и правки темы | Не работает на Nginx |
| Конфиг Nginx | Nginx или VPS с доступом к конфигам | Надёжно и быстро | Нужен доступ к настройкам сервера |
functions.php | Если нет доступа к серверу | Можно сделать точечный редирект внутри WordPress | Зависит от темы, не лучший вариант для большого числа правил |
Если есть доступ к серверу, лучше настраивать редиректы на уровне веб-сервера. Это надёжнее, чем держать логику в теме WordPress.
301 редирект в Apache через .htaccess
На большинстве хостингов с Apache редиректы прописывают в файле .htaccess в корне сайта. Перед правкой сделайте резервную копию файла: одна ошибка в синтаксисе может уронить сайт или дать 500-ю ошибку.
Для простого перенаправления одной страницы используйте правило Redirect 301:
Redirect 301 /staryi-url/ https://example.com/novyi-url/Здесь важно указывать путь от корня сайта, а не полный старый URL. Если нужно перенаправить несколько адресов, добавляйте отдельную строку для каждого.
Если у вас уже есть стандартный блок WordPress с правилами # BEGIN WordPress и # END WordPress, не вставляйте свои редиректы внутрь этого блока. Лучше разместить их выше, чтобы WordPress не перезаписывал логику при обновлении постоянных ссылок.
Для более гибких условий можно использовать mod_rewrite. Например, если нужно перенаправить конкретный старый адрес на новый:
RewriteEngine On
RewriteRule ^staryi-url/?$ https://example.com/novyi-url/ [R=301,L]Флаг R=301 задаёт постоянный редирект, а L останавливает обработку правила после срабатывания.
301 редирект в Nginx
На Nginx редиректы задаются в конфигурации сайта, обычно в блоке server. Если у вас обычный виртуальный хостинг без доступа к конфигам, этот способ может быть недоступен — тогда остаётся правка через WordPress или обращение в поддержку.
Для одного адреса правило выглядит так:
location = /staryi-url/ {
return 301 https://example.com/novyi-url/;
}Если нужно перенаправить старый URL на новый внутри того же домена, можно указать полный новый адрес или путь, но на практике полный URL обычно понятнее и безопаснее при смене домена.
После изменения конфига Nginx его нужно проверить и перезагрузить. На сервере с доступом по SSH это обычно делают через проверку синтаксиса конфигурации и reload сервиса. Конкретные команды зависят от дистрибутива и прав доступа, поэтому если вы не уверены, лучше не экспериментировать на рабочем сайте без бэкапа и окна обслуживания.
Точечный редирект через functions.php
Этот вариант полезен, когда доступа к серверным настройкам нет, а редирект нужен для одного-двух URL. Но использовать его как основное решение для большого числа правил не стоит: при смене темы логика может исчезнуть.
Добавьте код в functions.php дочерней темы или в собственный мини-плагин. Для одного старого адреса на новый:
add_action('template_redirect', function () {
if (is_page('staryi-url')) {
wp_redirect('https://example.com/novyi-url/', 301);
exit;
}
});Здесь is_page('staryi-url') проверяет страницу по ярлыку. Если у вас запись, а не страница, можно использовать is_single() или проверку по ID. После wp_redirect() обязательно вызывайте exit, иначе WordPress продолжит отдавать контент старой страницы.
Есть и более точный вариант для редиректа по конкретному URL запроса:
add_action('template_redirect', function () {
if (trim($_SERVER['REQUEST_URI'], '/') === 'staryi-url') {
wp_redirect(home_url('/novyi-url/'), 301);
exit;
}
});Такой код лучше использовать аккуратно: он зависит от текущего пути и может вести себя по-разному при наличии параметров, языковых префиксов и нестандартных правил ЧПУ.
Как избежать цепочек редиректов и лишних 404
Цепочка возникает, когда старый URL ведёт на промежуточный адрес, а тот — ещё дальше. Например: /old → /temp → /new. Для пользователя это лишняя задержка, а для поисковых систем — лишний обход. Правильнее сразу вести старый адрес на конечный новый URL.
Проверьте три вещи:
- старый URL отдаёт именно
301, а не302; - новый URL открывается без дополнительного редиректа;
- внутренние ссылки на сайте уже обновлены и не ведут на старый адрес.
Если после переноса страницы старый адрес всё ещё даёт 404, значит правило не сработало или указана неверная маска. Частая ошибка — забытый слэш в конце, особенно если на сайте настроены канонические URL со слэшем.
Как проверить, что редирект работает правильно
Самый простой способ — открыть старый URL в браузере и посмотреть, куда он приводит. Но для проверки кода ответа этого мало. Нужен ответ сервера.
Если у вас есть доступ к терминалу, можно проверить заголовки командой:
curl -I https://example.com/staryi-url/В ответе должен быть статус 301 Moved Permanently и заголовок Location с новым адресом. Если видите 200 OK, редиректа нет. Если 302, это временное перенаправление, и для переноса URL оно не подходит.
Ещё один практичный тест — открыть новый URL напрямую. Если он сам редиректит на другой адрес, у вас уже есть цепочка, и её лучше убрать на уровне правил или постоянных ссылок WordPress.
Что делать после переноса URL
После настройки редиректа обновите внутренние ссылки в контенте, меню и блоках. Иначе пользователь будет каждый раз проходить через лишний переход, а поисковый робот — тратить время на обход старых адресов.
Если старых URL много, сначала составьте список наиболее важных страниц: те, что получали трафик, внешние ссылки или были в меню. Именно их нужно закрывать редиректами в первую очередь. Остальные можно обработать по мере необходимости.
Если на сайте много дублей и старых адресов, имеет смысл отдельно проверить канонические URL, постоянные ссылки и структуру рубрик. Но сам 301 редирект должен оставаться простым: один старый адрес — один конечный новый адрес без промежуточных прыжков.
В WordPress без плагинов это решается вполне нормально: на Apache через .htaccess, на Nginx через конфиг сервера, а в самом WordPress — только для точечных случаев. Если делать редирект сразу на конечный URL и проверять ответ сервера, вы сохраните трафик и не создадите лишних 404.