MODx Revo Дублирование страниц по id и по url [Решение]

www.site.ru/1 и www.site.ru/pseudoname ссылаются на одну и ту же страницу! – Лечим дубли

Итак, недавно при создании очередного сайта на MODx Revo столкнулся с дублированием страниц по URL – это плохо сказывается на SEO сайта и вводит ваших посетителей в заблуждение.

Изрядно порывшись в интернете, было найдено решение, поэтому с разрешения автора я публикую эту статью у себя, чтобы больше людей узнали о решении данной проблемы.

Итак, если вы столкнулись с данной проблемой (проверить можно очень просто – откройте ссылку www.ваш-сайт.ru/id любого документа), то следуем инструкциям.

Создаёте новый сниппет, даёте ему название (у меня он «strict_url»). В этот сниппет копируете нижеприведенный код. Прописываете вызовы сниппета во всех используемых шаблонах, в самом начале(!), так чтобы не было ни одного пробела до начала декларации типа HTML. Скриншот как выглядит шаблон:

MODx Revo strict url

Сам сниппет можно скачать здесь.

Привожу его код:

<?php
/* Snippet for MODx Revolution/Сниппет для MODx Revolution
// Strict URL/Строгие URL
//
// version: 1.0.1 / версия 1.0.1
// Добавлена поддержка страниц getPage
// Добавлена поддержка страниц ошибок 404 и 403
// Добавлена поддержка использования вложенных УРЛов (настройка в разделе Friendly URLs)
// ID главной страницы считывается из настроек системы
*/

// Configuration/Настройки (конфиг)
$ending = ".html"; // Требуемое окончание url, оставить пустым, если у Вас не включены дружественные URL

// Strings prepare/Подготовка строк
$url=$_SERVER['REQUEST_URI'];
$url=(string)$url;

$id = $modx->resource->get('id');
$alias = $modx->resource->get('alias');
$ids = $modx->getChildIds($id,1);

$site_start = $modx->getOption('site_start');
$unauthorized_page = $modx->getOption('unauthorized_page');
$error_page = $modx->getOption('error_page');

if($url == "/")// Обращение к главной
{
	//echo "OK";
}
elseif($id == $site_start)
{
	header("HTTP/1.1 301 Moved Permanently");// Редирект на главную
	header("Location: /");
}
elseif($id == $error_page)
{
	header('HTTP/1.1 404 Not Found');// Обработка страницы: Ошибка 404
}
elseif($id == $unauthorized_page)
{
	header('HTTP/1.1 403 Forbidden');// Обработка страницы: Ошибка 403
}
elseif(!empty($ids)) // если есть дочерние
{
	// Поддержка страниц
 	if($_GET['page'] && $_GET['page']!=1) $correct_url="/$alias/?page=".$_GET['page'];
	else
	$correct_url="/$alias/";

	$res=strcmp($url,$correct_url);
	if($res==0)
	{
		//echo "OK";
	}
	else
	{
		header("HTTP/1.1 301 Moved Permanently");
		header("Location: $correct_url");
	}
}
else // если нет дочерних
{
    // Поддержка большой вложенности ресурсов
    $correct_url_path="/";
    $modxConfig = $modx->getConfig('');
    if($modxConfig["use_alias_path"]) // Если включена опция Вложенности URL
    {
        $parents=$modx->getParentIds((int)$id);
        $parents_count = count($parents);
        if($parents_count)
        {
            for($j=$parents_count;$j>0;$j--)
            {
                $parent=$parents[$j-1];
                $parent_obj = $modx->getObject('modResource',$parent);
				//if($parent) $correct_url_path .= $parent_obj->get('pagetitle');
                if($parent)
                {
                    $correct_url_path .= $parent_obj->get('alias');
                    $correct_url_path .= "/";
                }
            }
        }
    }

    if(!$alias)
    {
        $correct_url="$correct_url_path?id=$id";
    }
    else
    {
        $correct_url="$correct_url_path$alias$ending";
    }

	$res=strcmp($url,$correct_url);
	if($res==0)
	{
		//echo "OK";
	}
	else
	{
		header("HTTP/1.1 301 Moved Permanently");
		header("Location: $correct_url");
	}
}
?>

ВАЖНО:

У меня в MODx настроены дружественные URL (friendly URLs) делал под них (для SEO дружественные URL — большой плюс при продвижении в Яндексе). Без них (дружественных УРЛов) сниппет будет работать только после некоторых доработок на проверку наличия Псевдонима у ресурса. Дружественные URL настраиваются в общих настройках системы MODx Revolution.

Что действительно необходимо для корректной работы этого сниппета, так это прописанные для всех ресурсов Псевдонимы (alias’ы) по ним сниппет определяет какой URL является правильным.

Также для избежания ошибок вызов сниппета должен быть некэшируемым: [[!strict_url]]

Помимо этого, когда будете вставлять код сниппета, проследите, чтобы не было ни одного пробела ни перед

"<?php", ни перед "?>" - иначе может "поползти" вёрстка.

Поделиться с друзьями

Френдинг

 

Comments

No comments so far.

Leave a Reply

 
(will not be published)
 
 
Comment