Внутренняя Seo оптимизация [DLE 10.0]

Внутренняя Seo оптимизация [DLE 10.0]

Автор: АлаичЪ
Автор модификации: Дмитрий Арсеньев
Описание:
Представляем вашему вниманию статью, посвященную seo оптимизации dle сайтов. Статья написана с использованием материалов, опубликованных АлаичЪ на страницах своего блога. При этом использованы и протестированы те материалы, которые применимы и работают только в DLE 10.0.
Итак вы готовы к внутренней Seo оптимизации вашего сайта? Если «да», то приступим:
Склейка зеркал — выбираем главное зеркало www.site.ru или site.ru
Какие проблемы решаем: Полное дублирование сайта по адресам //site.ru и //www.site.ru

Открываем файл .htaccess, который находится в корне сайта (это там, где лежит основной index.php)
НАХОДИМ:

RewriteEngine On

НИЖЕ ДОБАВЛЯЕМ:
если в качестве основного зеркала выбран //site.ru

### START Определяем главное зеркало как site.ru (site.ru заменить на свой домен, например alaev.info)
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
### END Определяем главное зеркало

если в качестве основного зеркала выбран //www.site.ru

### START Определяем главное зеркало как www.site.ru (www.site.ru заменить на свой домен, например www.alaev.info)
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
### END Определяем главное зеркало


Теперь не важно, как пользователи будут в браузере вводить адрес сайта, с www или без — будет осуществляться редирект на основное зеркало сайта. Так же не важно, каким образом стоят внешние ссылки на сайт — вес всех входящих ссылок сохранится и суммируется для основного зеркала.
Убираем index.php из адреса главной страницы и страниц категорий:
Какие проблемы решаем:
-Дублирование главной страницы по адресам //site.ru и //site.ru/index.php
-Дублирование страниц категорий, тегов или других разделов при добавлении index.php на конце, например, //site.ru/category/index.php, //site.ru/search/index.php, //site.ru/tag/index.php и др.
Открываем файл .htaccess, который находится в корне сайта (это там, где лежит основной index.php)
В САМЫЙ КОНЕЦ ДОБАВЛЯЕМ:

### Редиректы с site.ru/category/index.php на site.ru/category/ и др.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.*)index\.php$
RewriteRule ^(.*)index\.php$ $1 [R=301,L]
### Редиректы с index.php на сайт
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ / [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]


Теперь не будет возникать самого распространённого дубля главной страницы, а так же дублей категорий и других разделов.
Склеиваем адреса страниц /page/1/ с основными адресами для главной страницы и категорий
Какие проблемы решаем:
-Дублирование главной страницы сайта по адресам //site.ru/page/1/ и //site.ru/
-Дублирование основной (первой) страницы категории по адресам //site.ru/category/page/1/ и //site.ru/category/
Открываем файл .htaccess, который находится в корне сайта (это там, где лежит основной index.php)
НАХОДИМ:

### END Определяем главное зеркало

НИЖЕ ДОБАВЛЯЕМ:

### START Редирект с первой страницы на основную
RewriteRule ^(.*)/page/1/$ $1/ [R=301,L]
RewriteRule ^(.*)page/1/$ $1/ [R=301,L]
### END Редирект с первой страницы на основную

Открываем файл /engine/engine.php
НАХОДИМ:

if (($subaction == "showfull" or $subaction == "addcomment") and ((! isset ( $category ) or $category == ""))) {

ВЫШЕ ДОБАВЛЯЕМ:

if ( ($config['allow_alt_url'] == "yes") && (intval($_GET['cstart']) == 1) && (strpos($_SERVER['REQUEST_URI'], '/page/1') !== false) ) {
		$first_page_url = str_replace ( "/page/1", "", $_SERVER['REQUEST_URI'] );
		header("HTTP/1.0 301 Moved Permanently");
		header("Location: $first_page_url");
		die("Redirect");
	}

Теперь при вводе неправильного адреса с /page/1/ на конце, будет осуществляться редиректить на основную страницу.
Убираем слеши из URL тегов, генерируемых движком:
Открываем файл: /engine/modules/show.short.php
Находим:

if( $config['allow_alt_url'] == "yes" ) [] = "<a href=\"" . $config['http_home_url'] . "tags/" . urlencode($value ) . "/\">" . $value . "</a>";

Заменяем:

if( $config['allow_alt_url'] == "yes" ) [] = "<a href=\"" . $config['http_home_url'] . "tags/" . urlencode($value ) . "\">" . $value . "</a>";

Открываем файл: /engine/modules/tagscloud.php
Находим:

[] = "<a href=\"".$config['http_home_url']."tags/".urlencode($value['tag'])."/\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";

Заменяем:

[] = "<a href=\"".$config['http_home_url']."tags/".urlencode($value['tag'])."\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";

Находим:

$tpl->result['tags_cloud'] .= "<br /><br /><a href=\"".$config['http_home_url']."tags/\">".$lang['all_tags']."</a>";

Заменяем:

$tpl->result['tags_cloud'] .= "<br /><br /><a href=\"".$config['http_home_url']."tags\">".$lang['all_tags']."</a>";

Находим:

[] = "<a href=\"".$config['http_home_url']."tags/".urlencode($value['tag'])."/\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";

Заменяем:

[] = "<a href=\"".$config['http_home_url']."tags/".urlencode($value['tag'])."\" class=\"{$value['size']}\" title=\"".$lang['tags_count']." ".$value['count']."\">".$value['tag']."</a>";

Открываем файл: /engine/modules/show.custom.php
Находим:

if( $config['allow_alt_url'] == "yes" ) [] = "<a href=\"" . $config['http_home_url'] . "tags/" . urlencode( $value ) ."/\">" . $value . "</a>";

Заменяем:

if( $config['allow_alt_url'] == "yes" ) [] = "<a href=\"" . $config['http_home_url'] . "tags/" . urlencode( $value ) ."\">" . $value . "</a>";

Открываем файл: /engine/modules/show.full.php
Находим:

if( $config['allow_alt_url'] == "yes" ) [] = "<a href=\"" . $config['http_home_url'] . "tags/" . urlencode($value ) . "/\">" . $value . "</a>";

Заменяем:

if( $config['allow_alt_url'] == "yes" ) [] = "<a href=\"" . $config['http_home_url'] . "tags/" . urlencode($value ) . "\">" . $value . "</a>";

Открываем файл: /engine/engine.php
Находим:

if ($config['allow_alt_url'] == "yes") $s_navigation .= " &raquo; <a href=\"" . $config['http_home_url'] . "tags/\">" . $lang['tag_cloud'] . "</a> » " . $tag;

Заменяем:

if ($config['allow_alt_url'] == "yes") $s_navigation .= " » " . $lang['tag_cloud'] . " » " . $tag;

В очередной раз открываем .htaccess
Находим:

# вывод отдельному тегу
RewriteRule ^tags/([^/]*)(/?)+$ index.php?do=tags&tag=$1 [L]
RewriteRule ^tags/([^/]*)/page/([0-9]+)(/?)+$ index.php?do=tags&tag=$1&cstart=$2 [L]

Заменяем:

# вывод отдельному тегу
RewriteRule ^tags$ index.php?do=tags [L]
RewriteRule ^tags/([^/]*)(/?)+$ index.php?do=tags&tag=$1 [L]
RewriteRule ^tags/([^/]*)/page/([0-9]+)(/?)+$ index.php?do=tags&tag=$1&cstart=$2 [L]

Большую работу мы с вами проделали, однако это еще не все.)))
Уникализация метаописания description для страниц пагинации сайта:
Открываем /engine/engine.php
НАХОДИМ:

if (intval($_GET['cstart']) > 1 ){
	$page_extra = ' &raquo; '.$lang['news_site'].' '.intval($_GET['cstart']);
} else $page_extra = '';

ЗАМЕНЯЕМ НА:

if (intval($_GET['cstart']) > 1 ){
	$page_extra = ' &raquo; '.$lang['news_site'].' '.intval($_GET['cstart']);
	$meta_ext_page = ' стр. ' .intval($_GET['cstart']);
} else {
	$page_extra = '';
	$meta_ext_page = '';
}

$meta_ext_page = ‘ стр. ‘ .intval($_GET[‘cstart’]); — эта часть отвечает за формирование «добавки» в meta description. intval($_GET[‘cstart’] — это номер страницы, а ‘ стр. ‘ — это собственно текст.
НАХОДИМ:

<meta name="description" content="{$metatags['description']}" />

ЗАМЕНЯЕМ НА:

<meta name="description" content="{$metatags['description']}{$meta_ext_page}" />


Все готово. Теперь повторяющихся метаописаний больше не будет.
Улучшение SEO характеристик заголовков title
Если у нашей публикации не задан «Метатег title», то по умолчанию будет выводиться следующий title «Название публикации — Название сайта». Или для категории, когда не задан «Метатег title», по умолчанию выводится следующий title «Название категории — Название сайта».
Какие проблемы решаем:
-Не самое оптимальное формирование title с точки зрения требований SEO
Вы верите в миф, что вес каждого слова в заголовке title обратно пропорционален их количеству, то есть, чем меньше слов в title, тем больший вес каждое из них будет иметь? Если вы согласны с этим мнением, то читайте дальше.
Открываем /engine/engine.php
НАХОДИМ:

$metatags['title'] = $nam_e . $page_extra . ' &raquo; ' . $metatags['title'];

ЗАМЕНЯЕМ НА:

$metatags['title'] = $nam_e . $page_extra;

НАХОДИМ:

$metatags['title'] = $titl_e . $page_extra . ' &raquo; ' . $config['home_title'];

ЗАМЕНЯЕМ НА:

$metatags['title'] = $titl_e . $page_extra;


Теперь все категории будут содержать в title только название категории, а публикации, соответственно, только название публикации.
SEO оптимизация заголовков title категорий
Предлагаю сделать так, чтобы оптимизированный тайтл (поле «Метатег title» категории) выводился только для первой страницы категории, а на всех остальных выводился приличный короткий тайтл (поле «Имя» категории).
Какие проблемы решаем:
-Не корректное с точки зрения SEO формирование заголовков title для страниц пагинации сайта
Открываем файл /engine/engine.php
НАХОДИМ:

if ( $metatags['header_title'] ) $metatags['title'] = stripslashes($metatags['header_title'].$page_extra);

ЗАМЕНЯЕМ НА:

//разные title для страниц пагинации, для первой полный title, для пагинации короткий
if ($do == "cat" and $category != '' and $subaction == '') { //если категория
	if ( $metatags['header_title'] and ! $page_extra ) $metatags['title'] = stripslashes($metatags['header_title']);
	else $metatags['title'] = stripslashes($cat_info[$category_id]['name']) . $page_extra;
} elseif ($dle_module == "main") { //если главная страница
	if ( ! $page_extra ) $metatags['title'] = stripslashes($config['home_title']);
	else $metatags['title'] = stripslashes($config['short_title']) . $page_extra;
} elseif ($metatags['header_title']) $metatags['title'] = stripslashes($metatags['header_title']);
//разные title для страниц пагинации, для первой полный title, для пагинации короткий


Сделали? Тогда можете считать, что вы выжали максимум возможностей из движка DLE! Но это еще не все.)))
Редирект с несуществующих страниц пагинации на правильные и существующие
Открываем файл /engine/modules/show.short.php и в самом низу находим:

}
?>

ВЫШЕ добавляем:

//редирект на последнюю страницу, если в url указана страница больше чем максимально существующая
$all_pages_count = @ceil( $count_all / $config['news_number'] );
	if ($cstart > $all_pages_count) {
		if ($all_pages_count > 1) {
			header('HTTP/1.1 301 Moved Permanently');
			header ('Location: ' . $url_page . '/page/' . $all_pages_count . '/');
			die();
		} else {
			header('HTTP/1.1 301 Moved Permanently');
			header ('Location: ' . $url_page . '/');
			die();
		}
	} 
//редирект на последнюю страницу, если в url указана страница больше чем максимально существующая


Немного поясню код: идет проверка на условие — если номер текущей страницы больше чем максимальное количество страниц на сайте (или в категории), то происходит редирект на последнюю страницу. Если запрашивается страница номер 2, а страниц всего одна, то происходит редирект на гравную страницу (или главную страницу категории).
Пример на пальцах, кто-то запрашивает страницу сайта site.ru/page/435/, а на этом сайте всего 268 страниц, следовательно, случится редирект на адрес site.ru/page/268/.
Редирект для публикаций, у которых отсутствует ID, на главную страницу
В панели вебмастера висит много страниц с ошибкой 404 такого вида site.ru/category/subcat/page-name.html, а по правилам должно быть так site.ru/category/subcat/123-page_name.html. Вот честно, до сих пор не понимаю, каким образом и почему пропал ID новости и кто ссылался на публикации таким образом. Никаких модулей и хаков, которые убирают из url его идентификатор я никогда не использовал, так что грешу на пользователей, которые «криво» ставят ссылки в своих бложеках на мой сайт. Ну да ладно, это уже не важно, а важно разобраться с этой проблемой!
Открываем все тот же файл /engine/engine.php и находим:

				if ($subaction == '') $subaction = "showfull";
			}

НИЖЕ добавляем:

// 301 редирект на главную с адресами страниц новостей, где пропал id
			if ( ( $config['allow_alt_url'] == "yes" ) && (strpos($_SERVER['REQUEST_URI'], '.html') !== false) && ($dle_module == "main") ) {
					header("HTTP/1.0 301 Moved Permanently");
					header("Location: {$config['http_home_url']}");
					die("Redirect");
			}
// 301 редирект на главную с адресами страниц новостей, где пропал id


Теперь все адреса, содержащие на конце .html и не содержащие в себе ID будут редиректиться на главную страницу. И не переживайте по поводу статических страниц, они, хоть и так же не имеют ID в url-адресе, но редиректиться не будут, а будут работать как и прежде.
Редирект для удаленных или несуществующих новостей на главную
Ну, тут стандартная ситуация и может встретиться на любом сайте. Вы удалили какую-то новость и, понятное дело, будет выдаваться 404 ошибка. Если вас это не устраивает, а именно то, что выдается 404 ошибка, то можно сделать, например, 301-редирект на главную страницу сайта, которая уж точно существует 😉
Открываем файл /engine/modules/show.full.php и находим:

	elseif( ! $news_found ) {
		@header( "HTTP/1.0 404 Not Found" );
		msgbox( $lang['all_err_1'], $lang['news_err_12'] );
	}

ЗАМЕНЯЕМ на:

// 301 редирект на главную, если новость не найдена/не существует
	elseif( ! $news_found ) {
					header("HTTP/1.0 301 Moved Permanently");
					header("Location: {$config['http_home_url']}");
					die("Redirect");
	}
// 301 редирект на главную, если новость не найдена/не существует


Теперь при переходе на несуществующую или удаленную публикацию будет осуществляться редирект на главную страницу сайта.
Запрещаем индексацию разделов сайта при помощи мета-тега robots
Расширенную версию данного трюка смотрите на форуме про правильный robots.txt для DLE
.
А сейчас я расскажу, как можно реализовать вывод этого самого метатега в движке DLE в определенных разделах сайта.
Открываем уже полюбившийся файл /engine/engine.php, находим бесполезную строку и удаляем:

<meta name="robots" content="all" />

Если такой строки нет, ничего страшного, просто идем дальше.
Находим далее:

if ($config['allow_rss']) $metatags .= <<<HTML
<link rel="alternate" type="application/rss+xml" title="{$rss_title}" href="{$rss_url}" />
HTML;

ВЫШЕ добавляем:

if ($subaction == 'userinfo' OR
	$subaction == 'allnews' OR
	$subaction == 'newposts' OR
	$do == 'stats' OR
	$do == 'addnews' OR
	$do == 'register' OR
	$do == 'favorites' OR
	$do == 'rules' OR
	$do == 'pm' OR
	$do == 'feedback' OR
	$do == 'lastcomments' OR
	$do == 'lostpassword' OR
	$do == 'search' OR
	$do == 'lastnews' OR
	$do == 'alltags' OR
	$do == 'tags' OR
	$dle_module == 'date') $metatags .= <<<HTML
\n<meta name="robots" content="noindex,nofollow" />
HTML;

Если вы хотите закрыть от индексации страницы пагинации, типа site.ru/page/X/ или site.ru/category/page/X/, тогда необходимо добавить одну строчку:

(intval($_GET['cstart']) > 1 )

В итоге код, приведенный выше преобразуется так:

if ($subaction == 'userinfo' OR
	$subaction == 'allnews' OR
	...
	$dle_module == 'date' OR
	(intval($_GET['cstart']) > 1 )) $metatags .= <<<HTML
\n<meta name="robots" content="noindex,nofollow" />
HTML;

Добавляем тег rel=”canonical” для страниц просмотра полной новости
Открываем файл /engine/modules/show.full.php и находим:

		} else {
			$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
			$print_link = $config['http_home_url'] . "engine/print.php?newsid=" . $row['id'];
			$short_link = "";
		}

ВЫШЕ добавляем:

$canonical = $full_link;

Открываем файл /engine/engine.php и находим:

if ($config['allow_rss']) $metatags .= <<<HTML
<link rel="alternate" type="application/rss+xml" title="{$rss_title}" href="{$rss_url}" />
HTML;

НИЖЕ добавляем:

if (isset($canonical)) $metatags .= <<<HTML
\n	<link rel="canonical" href="{$canonical}" />
HTML;

Вот и всё =)