rel canonical одним махом для всего сайта

rel canonical одним махом для всего сайта

rel canonical одним махом для всего сайта

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

Сразу хочу отметить, что данный пример подходит для большинства сайтов. Но будьте внимательны: возможно вам не нужно будет "избавляться" от некоторых страниц с параметрами, таких как страниц с пагинацией. В таком случае, вам нужно будет вводить условия, по которым будет работать нижеприведенный код.


<?
	$urlParts = parse_url($_SERVER["REQUEST_URI"]);
	echo "<link rel='canonical' href='http://".$_SERVER["HTTP_HOST"].$urlParts["path"]."'>\r\n";
?>

Мы воспользовались функцией parse_url(), которая принимает в качестве параметра непосредственно урл, а затем парсит его, вычленяя его составные части. Конкретно в нашем случае нам нужна часть path, которая отвечает за урл, относительно корня сайта и до начала GET-параметров.

После этого нам остается только собрать воедино наш канонический урл и эхом вывести его внутри тега <head>...</head>


  • Добрый день! Этот код - реальное счастье для владельца сайта! Долго искал и, наконец-то, нашел! Но, если возможно, подскажите, пожалуйста, "полному гуманитарию", как изменить этот код, чтобы каноническими указывались URL с некоторыми параметрами? Например, у меня на сайте есть общий раздел "Новости" с URL - /news, и есть собственно новости, URL которых выглядит так - /news?id=1, затем /news?id=2 и так далее. Указанный Вами код универсален (реально работает!!!), но в исходном коде каждой отдельной новости каноническим он указывает страницу /news Можно ли его как-то изменить, чтобы вышеуказанные параметры (?id=*) были допустимы, но иные дубли им нещадно "убивались" (например /news?id=1?bakbakbak, или /news?id=1&bakbakbak. Ничего в этом не соображаю, ищу в интернете примеры/образцы, переделываю, внедряю на свой сайт, но тут вообще все сложно и как здесь адаптировать применительно к моей ситуации - "ума не приложу" ... Логически понимаю, что надо как-то изменить функцию parse_url(), прописав условия для некоторых страниц (вероятно, что "if (preg_match)", но как именно - не знаю. Буду очень-очень-очень признателен за помощь! С уважением, Владимир
  • Здравствуйте, Владимир! Не вопрос, можем немного модифицировать код под ваши нужды =) попробуйте такой вариант: $urlParts = parse_url($_SERVER["REQUEST_URI"]); $urlParts["path"] = $urlParts["path"]."?".preg_replace("~&.*~i",'',$urlParts["query"]); echo "\r\n";
  • Максим, добрый вечер! Благодарю за оперативный ответ! Такой код работает с новостями, правильно указывает их каноническими, но теперь в исходном коде в конце всех других страниц (основных) добавляется "?": например: То есть, код автоматически добавляет знак "?" там, где его и не было. Посмотрите еще, пожалуйста! Ох уж этот rel='canonical' ...
  • Максим, прошу прощения за беспокойство, пока изучал этот вопрос, нашел вот такую формулу: У меня она в этом виде не работает (в том числе, менял $ENTRY_URL$ на $QUERY_STRING$, прочитав где-то о такой возможности), но в Ваших руках она точно преобразится! Вы такую не используете?
  • Нет, такую мне не доводилось использовать =)
  • Владимир, попробуйте прописать условие для формирования канонического урла: $urlParts = parse_url($_SERVER["REQUEST_URI"]); if(strpos($_SERVER["REQUEST_URI"], "?") !== false){ $urlParts["path"] = $urlParts["path"]."?".preg_replace("~&.*~i",'',$urlParts["query"]); } Если есть вхождение в урл знака вопроса "?", то используется один канонический урл. Если же нет вхождения, то используется другой (без добавления знака вопроса "?")
  • Максим, добрый вечер! Благодарю Вас за помощь! Этот код работает с основными страницами, с новостями. Но, на сайте есть дубли типа /index.php/%20news?request_url=/main/%20news&request_lang= , /main/contacts/feedback?imz_s=8vk3tuo6li7ce8d9irvbjjd9v1, которые он также честно прописывает в качестве канонических :) Откуда такие дубли взялись, даже предположить сложно; я их закрыл метатегом "noindex, nofollow", но ниже указывается, что эта страница еще и каноническая :) То есть, указывает каноническими абсолютно все страницы, где есть знак "?". Но знак вопроса в конце "правильного" УРЛа он уже не проставляет. Максим, как с Вами можно связаться, например, по Skype? Думаю, что эту проблему в рамках комментариев решить сложно; если у Вас будет время, хотел бы Вас попросить помочь мне с устранением некоторых ошибок на сайте, включая и корректную установку "правильных" канонических страниц (наверное, надо изучить параметры всех страниц, вычленить нужные и отсечь лишние, прописав их все в условиях). Есть еще вопросы по базе данных MySQL, по CKEditor, по вложению "main", по файлу htaccess, и еще несколько общих вопросов, ответы на которые в сети мне найти не удалось, так как необходимо, во-первых, видеть исходный материал, и во-вторых, владеть навыками программирования. Всеми материалами сайта я, естественно, располагаю, а вот образование и профессия мои сугубо гуманитарной направленности. Моей смекалки хватило на устранение замечаний валидаторов, ну и установки указанного выше метатега (по найденному в интернете образцу), а для всего остального нужна помощь специалиста Вашего профиля. Если Вам это будет интересно, дайте знать, пожалуйста. С уважением, Владимир
  • Владимир, напишите мне на admin@alittlebit.ru, попробую ответить на интересующие вас вопросы.