11.08.13, 10:50
0 комментарий
  DLE Хаки

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

Описание:
Это статья, посвященная seo оптимизации dle сайтов. Статья написана с использованием материалов, опубликованных АлаичЪ на страницах своего блога. При этом использованы и протестированы те материалы, которые применимы и работают только в DLE 10.0.

Итак вы готовы к внутренней Seo оптимизации вашего сайта? Если "да", то приступим:

Склейка зеркал — выбираем главное зеркало www.site.ru или site.ru

Какие проблемы решаем: Полное дублирование сайта по адресам http://site.ru и http://www.site.ru

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

RewriteEngine On


НИЖЕ ДОБАВЛЯЕМ:
если в качестве основного зеркала выбран http://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 Определяем главное зеркало


если в качестве основного зеркала выбран http://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 из адреса главной страницы и страниц категорий:

Какие проблемы решаем:
-Дублирование главной страницы по адресам http://site.ru и http://site.ru/index.php
-Дублирование страниц категорий, тегов или других разделов при добавлении index.php на конце, например, http://site.ru/category/index.php, http://site.ru/search/index.php, http://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/ с основными адресами для главной страницы и категорий

Какие проблемы решаем:
-Дублирование главной страницы сайта по адресам http://site.ru/page/1/ и http://site.ru/
-Дублирование основной (первой) страницы категории по адресам http://site.ru/category/page/1/ и http://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" ) $tags[] = "<a href="" . $config['http_home_url'] . "tags/" . urlencode($value ) . "/">" . $value . "</a>";


Заменяем:

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



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

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


Заменяем:

$tags[] = "<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>";


Находим:

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


Заменяем:

$tags[] = "<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" ) $tags[] = "<a href="" . $config['http_home_url'] . "tags/" . urlencode( $value ) ."/">" . $value . "</a>";


Заменяем:

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



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

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


Заменяем:

if( $config['allow_alt_url'] == "yes" ) $tags[] = "<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;




Вот и всё =)

Автор: АлаичЪ
Автор модификации: Дмитрий Арсеньев

Напишите своё мнение