Необычный редирект-вирус в DLE. Необычный редирект-вирус в DLE Редирект для публикаций, у которых отсутствует ID, на главную страницу
Есть у меня сайт на движке 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.
Актуальность: Все версии DLE. Проверено на 7.x, 8.x, 9.x, 10.x.
Итак, помните я недавно публиковал пост про , где говорил, что закрывать страницы от индексации при помощи robots.txt не тру, а вот закрывать при помощи правильный вариант . Настоятельно рекомендую изучить данный пост.
Если не чувствуете в себе уверенности, настоятельно рекомендую использовать ! С модулем вы по любому не ошибетесь нигде, а так же вам не придется после каждого обновления движка вносить данные правки.
Открываем уже полюбившийся файл /engine/engine.php, находим бесполезную строку и удаляем:
if ($config["allow_rss"]) $metatags .=