Справочники, инструменты, документация

PHP: Как сделать универсальный, автоматический rel canonical

Если на сайте есть страница, доступная по нескольким адресам, а также страницы с одинаковым или схожим содержимым, робот Яндекса может посчитать их дублями.

Тогда он объединит страницы в группу дублей и выберет для показа в результатах поиска только одну из них — наиболее информативную и релевантную поисковым запросам. Такая страница называется канонической.

Чтобы избежать проблем при SEO продвижении дубле страниц следует использовать атрибут rel canonical:

<?
    if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443){
        $protocol = 'https://';
    }else{
        $protocol = 'http://';
    }

    $url = $protocol.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];

    $urlend = strrpos($url, '?', -1); // Находим и удаляем все параметры (номер страницы, параметры фильтра)
    if($urlend != false){
        $url = substr($url, 0, $urlend);
    }


    if(mb_substr($url, -1) == '/'){ // Тут оставляем, если ссылки на сайте не заканчиваются на /, либо удаляем, если заканчиваются на /.
        $url = substr($url, 0, -1);
    }

 echo '<link rel="canonical" href="'.$url.'"/>';
?>

Вначале определяем, открывается ли сайт по безопасному протоколу или нет.

Потом собираем наш URL из протокола ($protocol), домена ($_SERVER['SERVER_NAME']) и ссылки ($_SERVER['REQUEST_URI']).

Далее определяем, есть ли в URL параметры или нет ($_SERVER['QUERY_STRING']). Если есть, их удаляем, они не нужны для тега.

И в конце (не обязательно) удаляем слеш, если ссылки формируются без него. Так-же это полезно, чтобы не использовать 301 редирект, который конфликтует с обработкой 404 страницы на разных CMS.