Известно, что для того, чтобы удержать посетителя на сайте, нужно правильно обрабатывать HTTP/1.0 404 и другие подобные коды. На просторах интернета можно найти массу занимательных примеров страниц 404, а также руководств – что и как сделать, чтобы ошибка 404 правильно обрабатывалась сайтом как для посетителя, так и для поисковых систем.
Хочу с вами обсудить проблему 404 для сайтов Joomla.
Общие рекомендации по настройке Joomla для обработки HTTP/1.0 404
Не буду повторять здесь все причины тех или иных шагов и настроек, буду перечислять кратко то, что можно найти в Интернете.
- Создаем в нашей Joomla «красивую страничку 404». Можно несколько — при реализации вашей особенной логики и способа их выбора для
посетителя; - В свой шаблон, который используется на сайте в качестве основного шаблона frontend, из системного шаблона system переписываем файл error.php;
- Далее редактируем этот файл для того, чтобы следовать следующей логике – если мы отловили ошибку 404 – то сначала выдать заголовок HTTP/1.0 404, а затем выдать страницу, которую мы ранее подготовили. Предположим, номер (ID) нашей «красивой страницы 404» равен 1001. Файл error.php в вашем шаблоне может выглядеть так:
defined('_JEXEC') or die;
if (!isset($this->error))
{
$this->error = JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
$this->debug = false;
}
// Get language and direction
$doc = JFactory::getDocument();
$app = JFactory::getApplication();
$this->language = $doc->language;
$this->direction = $doc->direction;
if($this->error->getCode()=='404') {
header("HTTP/1.0 404 Not Found");
header('Location: index.php?option=com_content&view=article&id=1001');
}
Теперь проверяем. Вводим адрес сайта. Далее – абракадабра после символа /. Работает? Работает, чего и следовало ожидать.
В чем подвох?
Открываем отладку страниц в вашем любимом браузере (мой любимый браузер – Fitefox с Firebug-ом), вкладка «Сеть», и смотрим заголовки, которыми общается браузер с сайтом.
Вводим адрес сайта – заголовок HTTP/1.0 200 OK
Теперь абракадабра… Ожидаем HTTP/1.0 400 Not Found — смотрим заголовки:
- Сначала HTTP/1.0 302 Found
- Затем наша красивая страница отдается браузеру с кодом HTTP/1.0 200 OK
Чем это плохо?
— Но, ведь, работает? — Скажете вы. Да, работает. А как на это смотрит поисковая система?
Был у меня переезд страниц сайта с одного раздела (папки) сайта на другой. Но переехать должны были не все страницы. Страницы старого раздела сайта были в индексе. Те, что переехали – выдавались с кодом HTTP/1.0 301 Moved Permanently (классика жанра) и поисковики их правильно «переехали» на новое место. А те, что должны были «кануть в лету» – так и мелькали в индексе, хотя физически отсутствовали на сайте, а при обращении к ним выдавалась «красивая страничка 404», но не код HTTP/1.0 404 (смотрим выше).
Выход из этой ситуации
Для страниц с ошибкой 404 я решил выдавать заголовок HTTP/1.0 404 Not Found и делать не редирект через заголовок Location, а читать поток «красивой страницы 404» и перенаправлять его браузеру. Вот реализация:
if($this->error->getCode()=='404') {
header("HTTP/1.0 404 Not Found");
$url=JURI::root()."index.php?option=com_content&view=article&id=1001";
$data = file_get_contents($url) or die("Cannot open URL");
echo $data;
}
Теперь, и нужная страница посетителю отдается при ошибке 404, и поисковая машина видет действительно код 404 и считает введенный адрес таковым — Not Found.
kovalevsky
И Вам действительно нравится использовать CMS, которая даже 404 сама показать не может?
mokhin-denis
Здесь речь идет не о том, что Joomla не умеет обрабатывать 404. «Из коробки» — прекрасно умеет, и отдает всё с кодом HTTP/1.0 404 Not Found. Но выглядит это неприглядно:
И далее у сайтостроителя 2 варианта — оставить как есть или кастомизировать. Здесь я описал свой способ изменить 404 страницу так, чтобы и посетителю — гуд, и поисковики поймали верный HTTP/1.0 404, а не какой другой.