Статья о внутренней оптимизации движка Dle. Написана с использованием материалов, опубликованных АлаичЪ на страницах своего блога. При этом использованы и протестированы те материалы, которые применимы и работают только в Dle 9.8 .
1. Склейка зеркал — выбираем главное зеркало 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 заменить на свой домен)
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 заменить на свой домен)
RewriteCond %{HTTP_HOST} ^site.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
### END Определяем главное зеркало
Теперь не важно, как пользователи будут в браузере вводить адрес сайта, с www или без — будет осуществляться редирект на основное зеркало сайта. Так же не важно, каким образом стоят внешние ссылки на сайт — вес всех входящих ссылок сохранится и суммируется для основного зеркала.
2. Убираем 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]
Теперь не будет возникать самого распространённого дубля главной страницы, а так же дублей категорий и других разделов.
3. Склеиваем адреса страниц /page/1/ с основными адресами для главной страницы и категорий.
Какие проблемы решаем:
— Дублирование главной страницы сайта по адресам http://site.ru/page/1/ и http://site.ru/.
— Дублирование основной (первой) страницы категории по адресам http://site.ru/category/page/1/ и http://site.ru/category/.
Установка:
Открываем файл .htaccess, который находится в корне сайта (это там, где лежит основной index.php) и находим (см.пункт 1 исправлений):
### 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/ на конце, будет осуществляться редиректить на основную страницу.
4. Редирект с несуществующих страниц пагинации на правильные и существующие.
Какие проблемы решаем:Возьмем вполне реальную ситуацию – по какой-то причине вы решили изменить количество новостей, выводимых на главной странице или страницах категорий. Как случилось у меня: редизайн сайта; структура страниц полностью поменялась; было решено выводить больше кратких анонсов новостей на каждой странице (было 7, стало 10). Итог был следующим — в панели вебмастера появилось много страниц с 404 ошибками. Простая арифметика, было на сайте 1000 новостей, на каждой странице выводилось по 7 анонсов, следовательно, только на главной у нас получается 1000/7=142 страницы пагинации. После изменений страниц стало ровно 100. В итоге 42 страницы просто пропали. А если возьмем еще категории, то несуществующих страниц уже сотня-две. Это плохо, некрасиво и вообще не тру.
Установка:
Открываем файл /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/.
5. Редирект с разделов или категорий, которых больше не существует, на главную страницу.
Какие проблемы решаем:Опять же пример из жизни: вы решили поменять структуру сайта или просто удалили какие-то категории за ненадобностью, следовательно, эти страницы перестанут существовать, а ссылки на них могут где-то остаться. Например, у меня когда-то были блоги для пользователей, доступные по адресу site.ru/blog/, а в них шло деление на пользователей, вот так site.ru/blog/user1/, site.ru/blog/user2/ и т.д. Уже много лет как я снес эти блоги за ненадобностью, а ссылки на них и ошибки в панели вебмастера живут.
Установка:
Открываем файл /engine/engine.php и находим:
if (!$category_id) $category_id = 'not detected';
Заменяем на:
//решение проблемы с категориями, которых не существует
if ($config['allow_alt_url'] == "yes" AND ! $category_id AND $view_template != "rss") {
header("HTTP/1.0 301 Moved Permanently");
header("Location: {$config['http_home_url']}");
die("Redirect");
}
//решение проблемы с категориями, которых не существует
Теперь все категории или каталоги, которые не существуют и не имеют своего id (проверка на существование идет именно по id) будут редиректиться на главную страницу.
6. Редирект для удаленных или несуществующих новостей на главную.
Какие проблемы решаем:Ну, тут стандартная ситуация и может встретиться на любом сайте. Вы удалили какую-то новость и, понятное дело, будет выдаваться 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 редирект на главную, если новость не найдена/не существует
Теперь при переходе на несуществующую или удаленную публикацию будет осуществляться редирект на главную страницу сайта.
7. Запрещаем индексацию разделов сайта при помощи мета-тега robots.
Какие проблемы решаем:Итак, помните я говорил, что лучше запрещать индексацию страниц и разделов при помощи метатега , а не при помощи robots.txt. А сейчас я расскажу, как можно реализовать вывод этого самого метатега в движке DLE в определенных разделах сайта.
Установка:
Открываем файл /engine/engine.php, находим бесполезную строку и удаляем: Если такой строки нет, ничего страшного, просто идем дальше.Находим далее:
if ($config['allow_rss']) $metatags .= 1)) OR /* Страницы пагинации только для категорий */
//($do == 'cat' and $category != '' and $subaction == '') OR /* Просмотр любой категории */
//($do == 'cat' and $category_id == 'X' and $subaction == '') OR /* Просмотр определенной категории. X заменить на id категории */
$catalog != '' /* Просмотр каталога по буквенному идентификатору */
) $metatags .=