image

Известно, что для того, чтобы удержать посетителя на сайте, нужно правильно обрабатывать HTTP/1.0 404 и другие подобные коды. На просторах интернета можно найти массу занимательных примеров страниц 404, а также руководств – что и как сделать, чтобы ошибка 404 правильно обрабатывалась сайтом как для посетителя, так и для поисковых систем.

Хочу с вами обсудить проблему 404 для сайтов Joomla.

Общие рекомендации по настройке Joomla для обработки HTTP/1.0 404


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

  1. Создаем в нашей Joomla «красивую страничку 404». Можно несколько — при реализации вашей особенной логики и способа их выбора для
    посетителя;
  2. В свой шаблон, который используется на сайте в качестве основного шаблона frontend, из системного шаблона system переписываем файл error.php;
  3. Далее редактируем этот файл для того, чтобы следовать следующей логике – если мы отловили ошибку 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 — смотрим заголовки:

  1. Сначала HTTP/1.0 302 Found
  2. Затем наша красивая страница отдается браузеру с кодом HTTP/1.0 200 OK

image

Чем это плохо?


— Но, ведь, работает? — Скажете вы. Да, работает. А как на это смотрит поисковая система?

Был у меня переезд страниц сайта с одного раздела (папки) сайта на другой. Но переехать должны были не все страницы. Страницы старого раздела сайта были в индексе. Те, что переехали – выдавались с кодом 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.

Комментарии (2)


  1. kovalevsky
    19.11.2015 13:16

    И Вам действительно нравится использовать CMS, которая даже 404 сама показать не может?


    1. mokhin-denis
      19.11.2015 18:02

      Здесь речь идет не о том, что Joomla не умеет обрабатывать 404. «Из коробки» — прекрасно умеет, и отдает всё с кодом HTTP/1.0 404 Not Found. Но выглядит это неприглядно:
      Ошибка 404 Joomla 'из коробки'
      И далее у сайтостроителя 2 варианта — оставить как есть или кастомизировать. Здесь я описал свой способ изменить 404 страницу так, чтобы и посетителю — гуд, и поисковики поймали верный HTTP/1.0 404, а не какой другой.