Дубли в WordPress не всегда связаны с параметрами или фильтрами. На живых проектах часто всплывает более тихая проблема: одна и та же страница открывается по разным адресам из-за слеша в конце URL, варианта www и без него, а иногда — из-за разного регистра в пути. Для пользователя это незаметно, а для поисковика это уже несколько URL с одинаковым содержимым.
Если не привести адреса к одному виду, в индексе могут остаться лишние версии страниц, а ссылки и поведенческие сигналы будут размазываться. Ниже — как диагностировать именно этот сценарий и что править в WordPress без лишней магии.
Как понять, что проблема именно в URL-каноникализации
Сначала проверьте, действительно ли сайт отдает разные версии одной страницы. Не путайте это с дублями от пагинации, архивов или параметров запроса — здесь речь о нормализации самого адреса.
Что смотреть в первую очередь
- открывается ли страница и с
/в конце, и без него; - есть ли разница между
https://site.ru/pageиhttps://www.site.ru/page; - не отдает ли сервер 200 OK на обе версии вместо редиректа;
- совпадает ли
rel=canonicalс основным адресом; - не индексируются ли старые варианты в Google Search Console.
Быстрая проверка через консоль:
curl -I https://example.com/page
curl -I https://example.com/page/
curl -I https://www.example.com/pageЕсли в ответе везде 200 OK, а не 301 Moved Permanently, значит нормализация не настроена. Для SEO это почти всегда лишний риск.
Что именно нужно привести к одному виду
В WordPress есть несколько уровней, где можно зафиксировать основной вариант адреса. Лучше не ограничиваться только canonical: редирект должен работать на уровне сервера или WordPress, а canonical — подтверждать выбор для поисковика.
| Подход | Что делает | Когда подходит |
|---|---|---|
| Настройки WordPress | Задает базовый URL сайта | Если проблема в www, протоколе или домене |
| Редирект на сервере | Жестко сводит все варианты к одному адресу | Если нужно убрать дубли быстро и надежно |
| Код в теме/плагине | Дополняет canonical и нестандартные правила | Если часть URL генерируется темой или кастомным кодом |
Пошаговое решение
1. Зафиксируйте основной домен в WordPress
Проверьте значения WordPress Address (URL) и Site Address (URL) в Настройки → Общие. Они должны быть одинаковыми и содержать только один выбранный вариант: либо с www, либо без него.
Если доступ в админку ограничен, можно поправить это в wp-config.php:
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');Это не решает все дубли само по себе, но убирает расхождения на уровне генерации ссылок внутри WordPress.
2. Настройте 301-редирект на канонический вариант
Если сервер Apache, самый прямой способ — через .htaccess. Ниже пример, который убирает www и приводит URL без слеша в конце для не-иерархических адресов WordPress. Перед внедрением проверьте, что у вас нет отдельной логики для мультиязычности или нестандартных маршрутов.
<IfModule mod_rewrite.c>
RewriteEngine On
# Убираем www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
# WordPress rules
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>Для Nginx логика обычно выносится в конфиг сервера. Если у вас нет доступа к нему, редирект можно сделать через WordPress, но это запасной вариант, а не лучший.
3. Добавьте канонический URL, если тема его ломает
Большинство тем и сам WordPress уже выводят canonical. Проблема возникает, когда тема переопределяет шаблон wp_head, подключает лишние SEO-скрипты или генерирует адреса вручную. Тогда можно принудительно поправить canonical через фильтр rel_canonical.
add_filter('rel_canonical', function ($canonical) {
if (is_singular()) {
$canonical = get_permalink();
}
return $canonical;
});Этот код не нужен на каждом сайте. Используйте его только если вы реально видите некорректный canonical в исходном коде страницы.
4. Проверьте, не создают ли дубли плагины и тема
Иногда дубли появляются не из-за сервера, а из-за шаблонов: меню, хлебные крошки, блоки похожих записей и кастомные ссылки могут собирать URL вручную. Если в коде встречается конкатенация вроде home_url('/Page/') или жестко прописанные адреса, это источник проблем.
Правильнее использовать функции WordPress, которые возвращают уже нормализованный URL:
$url = get_permalink($post_id);
$link = home_url('/contact/');
$term_link = get_term_link($term);Если в проекте есть SEO-плагин, проверьте, не дублирует ли он canonical и meta robots. На некоторых сборках это приводит к конфликтам, когда один плагин ставит одну версию адреса, а тема — другую.
Как проверить, что решение сработало
После настройки не ограничивайтесь визуальной проверкой в браузере. Нужны именно технические признаки, что дубли ушли.
- запросы
curl -Iна альтернативные URL возвращают301на основной адрес; - в исходном коде страницы canonical совпадает с финальным URL;
- в браузере нет цепочки редиректов из нескольких шагов;
- в Search Console старые варианты постепенно выпадают из отчета по страницам;
- в логах сервера нет массовых обращений к неканоническим URL.
Полезно проверить и заголовки:
curl -I -L https://www.example.com/page/Если команда показывает цепочку из двух и более редиректов, ее стоит сократить. Один редирект лучше, чем несколько подряд.
Частые ошибки и как их исправить
Редирект сделан, но canonical остался старым
Так бывает, если редирект настроен на сервере, а тема или плагин продолжают выводить старый адрес в rel=canonical. Исправление: проверьте шаблон wp_head, SEO-плагин и фильтр rel_canonical.
Сайт начинает зацикливать редиректы
Обычно причина в конфликте между настройками WordPress и правилами сервера. Например, WordPress считает основным адресом https://www.example.com, а Nginx уже принудительно отправляет на https://example.com. В итоге запросы гоняются по кругу. Нужно оставить только один источник истины.
Сломались вложенные страницы и рубрики
Это частая ошибка, когда в правилах редиректа слишком агрессивно убирают слеш у всех URL подряд. Для иерархических страниц и некоторых архивов WordPress слеш может быть частью корректного маршрута. Перед массовым правилом обязательно тестируйте несколько типов URL: записи, страницы, рубрики, архивы дат.
Меню и внутренние ссылки ведут на разные версии
Причина обычно в ручной верстке или старых ссылках в контенте. После нормализации адресов имеет смысл прогнать поиск по базе на старые варианты домена и заменить их на канонический URL. Делайте это аккуратно, с резервной копией.
Что делать для безопасности и производительности
Редиректы и canonical сами по себе не тяжелые, но плохая реализация может создать лишнюю нагрузку. Не размножайте правила в нескольких местах: .htaccess, functions.php, SEO-плагин и настройки CDN не должны спорить между собой.
Если правите кодом, выносите его в небольшой mu-plugin или в отдельный плагин проекта, а не в активную тему. Так правило не потеряется после обновления темы. И не забывайте проверять, что редирект не ломает кеширование: после внедрения очистите серверный кеш, кеш плагина и CDN, если он есть.
Если нужен более широкий контроль над дублями, каноникалами и технической чисткой сайта, иногда проще закрыть этот слой через специализированный SEO-плагин. Но даже в этом случае базовый редирект на уровне сервера лучше не игнорировать: он надежнее и быстрее для роботов.
После внедрения сохраните короткий чек-лист для поддержки проекта:
- основной домен зафиксирован в WordPress;
- альтернативные варианты URL отдают 301;
- canonical совпадает с финальным адресом;
- внутренние ссылки генерируются через функции WordPress;
- после обновлений темы редирект не исчезает.
Если один из пунктов снова ломается после обновления темы или плагина, искать проблему нужно не в SEO, а в том, кто перезаписывает URL на уровне шаблонов или конфигурации сервера.