Canonical, слеши и дубли страниц: простая техническая проверка

Дубли страниц часто появляются незаметно. Страница открывается со слешем и без слеша, с www и без www, по HTTP и HTTPS, с параметрами сортировки, фильтрами или UTM-метками. Для пользователя это один и тот же материал, а для поисковой системы — несколько URL с похожим содержимым.

Canonical и редиректы помогают привести такие адреса к одному основному варианту. Но сначала нужно понять, какие дубли реально открываются.

Проверить варианты домена

Начать стоит с базовых вариантов: HTTP, HTTPS, www и без www.

curl -I http://example.ru/
curl -I https://example.ru/
curl -I http://www.example.ru/
curl -I https://www.example.ru/

Обычно выбирают один основной домен, а остальные варианты отправляют на него через 301. Например, основной — https://example.ru/.

server {
    server_name www.example.ru;
    return 301 https://example.ru$request_uri;
}

Слеш в конце URL

Для сайта не так важно, выбран вариант со слешем или без. Важно, чтобы был один вариант. Если оба URL отдают 200, получается дубль.

curl -I https://example.ru/blog
curl -I https://example.ru/blog/

Если проект использует URL со слешем, вариант без слеша должен редиректить. Или наоборот. Главное — единообразие.

Canonical

Canonical должен указывать на основной URL текущей страницы. Его удобно проверить через curl:

curl -s https://example.ru/blog/post/ | grep -i canonical

Пример:

<link rel="canonical" href="https://example.ru/blog/post/">

Плохие признаки:

  • canonical указывает на тестовый домен;
  • canonical использует http вместо https;
  • canonical одинаковый на всех страницах;
  • canonical ведёт на URL с 404 или 301;
  • canonical отсутствует на страницах с параметрами.

Параметры URL

UTM-метки, сортировка, фильтры и параметры пагинации могут создавать множество вариантов одной страницы. Не все из них нужно индексировать.

https://example.ru/catalog/?sort=price
https://example.ru/catalog/?utm_source=test
https://example.ru/catalog/?page=2

Для UTM обычно canonical указывает на чистый URL без меток. Для пагинации и фильтров решение зависит от структуры сайта. Нельзя автоматически закрывать всё подряд, если страницы фильтров важны для поиска.

Yii2 и формирование canonical

В Yii2 canonical часто регистрируют в layout или в конкретном view. Главное — не сделать один общий canonical для всех страниц.

$this->registerLinkTag([
    'rel' => 'canonical',
    'href' => Url::to(['blog/view', 'slug' => $model->slug], true),
]);

Url::to с true создаёт абсолютный URL. Поэтому важно, чтобы hostInfo был настроен правильно.

'urlManager' => [
    'hostInfo' => 'https://example.ru',
],

sitemap и canonical должны совпадать

В sitemap.xml лучше добавлять только основные URL. Если sitemap содержит адрес без слеша, а canonical на странице указывает вариант со слешем, это создаёт лишний сигнал о несогласованности.

curl https://example.ru/sitemap.xml | grep "/blog/post"

Для больших сайтов полезно периодически проверять, что URL из sitemap отдают 200 и canonical указывает сам на себя.

robots.txt не решает всё

Иногда дубли пытаются закрыть через robots.txt. Это не всегда правильный путь. Если URL закрыт от обхода, поисковая система может не увидеть canonical на странице. Для дублей чаще полезнее 301 редирект или корректный canonical.

robots.txt стоит использовать для служебных разделов, а не как универсальную замену архитектуре URL.

Короткий чек-лист

  1. Проверить HTTP и HTTPS.
  2. Проверить www и без www.
  3. Проверить URL со слешем и без слеша.
  4. Проверить canonical на основных типах страниц.
  5. Убедиться, что canonical не ведёт на тестовый домен.
  6. Проверить URL с UTM и сортировкой.
  7. Сравнить sitemap.xml и canonical.
  8. Проверить редиректы старых адресов.

Дубли не всегда дают мгновенную проблему, но постепенно создают технический шум. Лучше один раз выбрать правила URL и последовательно соблюдать их в редиректах, canonical, sitemap и внутренних ссылках.

Комментарии (0)

Пока нет комментариев. Будьте первым!