Необычный редирект-вирус в DLE. Необычный редирект-вирус в DLE Редирект для публикаций, у которых отсутствует ID, на главную страницу

04.08.2021 Новости

Есть у меня сайт на движке DataLife Engine и решил я сменить его профиль. Не кардинально, просто немного сузить тематику. Для этого мне нужно было удалить с сайта больше половины контента, не относящегося к этой тематике. Начал понемногу чистить страницы, заменяя их содержимое на новый контент. Но все равно пришлось менять структуру URL и из-за этого в панели вебмастеров появилось , снизилась посещаемость, позиции в поиске по узкой тематике. Кроме этого заметил что на удаленные страницы есть ссылки с форумов и сервисов типа otvet.mail.ru . При переходе с этих страниц отдавалась ошибка 404. Кроме данного технического факта следуют другие отрицательные факторы — теряется ссылочный вес, снижаются поведенческие показатели и, думаю, еще ряд негативных последствий.

Решил я это исправить брутальным методом — по всем удаленным страницам отдавать не 404 ошибку, а делать 301 редирект на главную. В CMS DLE для того, чтобы осуществить данный хак нужно в файле /engine/modules/show.full.php найти код:

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

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 редирект на главную, если новость не найдена/не существует

Теперь все при обращении поискового робота ему будет отдаваться сообщение о том, что информация с данной страницы перенесена навсегда на главную и весь ссылочный вес, который идет на удаленные страницы будет перераспределяться на главную.

Посетителей с удаленных страниц просто перенаправит на главную и, надеюсь, дальше они догадаются воспользоваться поиском.

Теперь опишу примерно такую же логику пере адресации, но уже не для новостей, а для категорий. Открываем файл /engine/engine.php и ищем код:

if (! $category_id ) $category_id = "not detected" ;

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" ) ; } //решение проблемы с категориями, которых не существует

//решение проблемы с категориями, которых не существует 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"); } //решение проблемы с категориями, которых не существует

Все. Теперь то же самое будет работать и для удаленных категорий DLE.

Привет, друзья. Наконец-то пришло время для третьей части моего мега-руководства по оптимизации DLE.

Только сейчас с ужасом осознал, что предыдущая вторая часть руководства вышла более полугода назад!

По сложившейся традиции мы будем говорить о , а конкретно в этой части я расскажу про некоторые особенности движка и мелкие, но очень полезные фишки и хаки , которые не подошли по формату в предыдущих частях.

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

Пост обновлен 6 мая 2014 года :
Обновлены вносимые в движок изменения, добавлена поддержка новых версий движка.
Актуально для следующих версий DLE : 7.x, 8.x, 9.x, 10.x!

Другие части SEO-руководства:
Часть 1, Оптимизация заголовков Title
Часть 2, Борьба с дублированием контента —
Часть 4, Исправление для версий DLE 9.3, 9.4, 9.5, 9.6 —

Редирект с несуществующих страниц пагинации на правильные и существующие

Фишка была придумана буквально сегодня, когда я нашел множество 404 ошибок на одном из сайтов в панели вебмастера.

Возьмем вполне реальную ситуацию – по какой-то причине вы решили изменить количество новостей, выводимых на главной странице или страницах категорий . Как случилось у меня: редизайн сайта; структура страниц полностью поменялась; было решено выводить больше кратких анонсов новостей на каждой странице (было 7, стало 10). Итог был следующим — в панели вебмастера появилось много страниц с 404 ошибками . Простая арифметика, было на сайте 1000 новостей, на каждой странице выводилось по 7 анонсов, следовательно, только на главной у нас получается 1000/7=142 страницы пагинации. После изменений страниц стало ровно 100. В итоге 42 страницы просто пропали. А если возьмем еще категории, то несуществующих страниц уже сотня-две. Это плохо, некрасиво и вообще не тру.

Открываем файл /engine/modules/show.short.php и в самом низу находим :

} ?>

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

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

//редирект на последнюю страницу, если в 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/.

Редирект с несуществующих страниц пагинации комментариев на правильные

Актуальность: Только версии DLE 8.x, 9.x. Для DLE 10.x не актуально, т.к. уже реализовано в самом движке.

Аналогичная ситуация с пагинацией в комментариях. Может возникнуть такая ситуация, что, например, вам наспамили в комментариях, поисковики проиндексировали все страницы комментариев, а потом вы это заметили и удалили все комменты. Но страницы, которые проиндексировал поисковик, все равно останутся, просто на них не будут отображаться никакие комментарии, а будет полный дубль основной страницы новости. И это печально, надо исправлять!

Открываем файл /engine/classes/comments.class.php и в самом низу находим :

} } ?>

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

//редирект на последнюю страницу комментариев, если в url указана страница больше чем максимально существующая if ($this->cstart > $enpages_count) { header("HTTP/1.1 301 Moved Permanently"); header("Location: " . $url); die(); } //редирект на последнюю страницу комментариев, если в url указана страница больше чем максимально существующая

Ну вот, теперь все в порядке, можете проверить.

Редирект со ссылок с лишними символами или неправильным окончанием на верные адреса

Актуальность: Все версии DLE. Проверено на 7.x, 8.x, 9.x, 10.x.

Раньше тут было очень сложное решение, которое зависело от версии движка. Но с момента написания данного поста я достаточно прокачал свои умения, чтобы составить универсальное решение для всех версий DLE и вообще совершенно для любого движка или любого сайта!

Открываем.htaccess, который лежит в корне и находим :

RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^(.*)\.html(.+) RewriteCond %{REQUEST_URI} ^(.*)\.htm$ RewriteCond %{REQUEST_URI} ^(.*)\.ht$ RewriteCond %{REQUEST_URI} ^(.*)\.h$ RewriteCond %{REQUEST_URI} ^(.*)\.$ RewriteRule ^(.*)\.(.*) $1.html

Вне зависимости от выбранного типа ЧПУ при переходе по любой «кривой» ссылке посетитель попадет туда, куда должен был попасть .

Редирект с разделов или категорий, которых больше не существует, на главную страницу

Актуальность: Все версии DLE. Проверено на 7.x, 8.x, 9.x, 10.x.

Пример из жизни: вы решили поменять структуру сайта или просто удалили какие-то категории за ненадобностью , следовательно, эти страницы перестанут существовать, а ссылки на них могут где-то остаться. Например, на emofans’е у меня когда-то были блоги для пользователей, доступные по адресу site.ru/blog/, а в них шло деление на пользователей, вот так site.ru/blog/user1/, site.ru/blog/user2/ и т.д. Уже много лет как я снес эти блоги за ненадобностью, а ссылки на них и ошибки в панели вебмастера живут.

Еще данная правка позволит избежать появления адресов страниц полной новости без расширения на конце или вообще адресов полной новости когда отсутствует целый кусок url в конце. Таким образом, в сочетании с предыдущим пунктом, эти изменения помогут на 99% избежать появления неверных и нежелательный адресов .

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

if (! $category_id ) $category_id = "not detected" ;

if (!$category_id) $category_id = "not detected";

ЗАМЕНЯЕМ на:

//решение проблемы с категориями, которых не существует if (!$category_id AND $view_template != "rss") { header("HTTP/1.0 301 Moved Permanently"); header("Location: {$config["http_home_url"]}"); die("Redirect"); } //решение проблемы с категориями, которых не существует

Редирект для публикаций, у которых отсутствует ID, на главную страницу

Актуальность: Все версии DLE. Проверено на 7.x, 8.x, 9.x, 10.x.

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

Только для версий DLE 10.x (а так же для 9.5, 9.6, 9.7 и 9.8)

Новая версия кода помимо того, что редиректит «проблемные» адреса страниц полной новости, но так же редиректит на главную еще и несуществующие или удаленные статические страницы. Связано это с изменившейся логикой в движке. С одной стороны, наверное, это хорошо, ведь одним махом две проблемы решаем. С другой стороны, изначально движок выдает обычную 404 ошибку — если вас устраивает такое положение дел, тогда не вносите правки, описанные в этом пункте.

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

@ header ( "HTTP/1.0 404 Not Found" ) ; $lang [ "static_page_err" ] = str_replace ("{page}" , $name . ".html" , $lang [ "static_page_err" ] ) ; msgbox( $lang [ "all_err_1" ] , $lang [ "static_page_err" ] ) ;

@header("HTTP/1.0 404 Not Found"); $lang["static_page_err"] = str_replace ("{page}", $name.".html", $lang["static_page_err"]); msgbox($lang["all_err_1"], $lang["static_page_err"]);

ЗАМЕНЯЕМ на:

// 301 редирект на главную с адресов страниц новостей, где пропал id, а так же несуществующих статических страниц header("HTTP/1.0 301 Moved Permanently"); header("Location: {$config["http_home_url"]}"); die("Redirect"); // 301 редирект на главную с адресов страниц новостей, где пропал id, а так же несуществующих статических страниц

Старое решение. Только для версий DLE 7.x, 8.x, 9.0, 9.2 и 9.3

Все адреса, содержащие на конце.html и не содержащие в себе ID будут редиректиться на главную страницу. Существующие и корректные статические страницы, хоть и они так же не имеют ID в url-адресе, редиректиться не будут, а будут работать как и прежде.

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

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

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

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

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

// 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

Редирект для удаленных или несуществующих новостей на главную

Актуальность: Все версии DLE. Проверено на 7.x, 8.x, 9.x, 10.x.

Ну, тут стандартная ситуация и может встретиться на любом сайте. Вы удалили какую-то новость и, понятное дело, будет выдаваться 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" ] ) ; }

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 редирект на главную, если новость не найдена/не существует

Теперь при переходе на несуществующую или удаленную публикацию будет осуществляться редирект на главную страницу сайта.

А вообще, ребята, у меня есть отдельный очень большой пост про .
Я вам рекомендую с ним ознакомиться, независимо от того, работаете ли вы только с DLE или другой какой-то CMS.

Запрещаем индексацию разделов сайта при помощи мета-тега robots

Актуальность: Все версии DLE. Проверено на 7.x, 8.x, 9.x, 10.x.

Итак, помните я недавно публиковал пост про , где говорил, что закрывать страницы от индексации при помощи robots.txt не тру, а вот закрывать при помощи правильный вариант . Настоятельно рекомендую изучить данный пост.

Если не чувствуете в себе уверенности, настоятельно рекомендую использовать ! С модулем вы по любому не ошибетесь нигде, а так же вам не придется после каждого обновления движка вносить данные правки.

Открываем уже полюбившийся файл /engine/engine.php, находим бесполезную строку и удаляем:

if ($config["allow_rss"]) $metatags .=