Правильная обработка 404 not found в Joomla

ПРОБЛЕМА

По умолчанию Joomla не умеет отдавать станицу 404 Not Found так, как рекомендуют поисковики. В интернетах есть несколько способов решения разной степени свежестии понятности, но нигде нет полного рецепта. Дело в том, что все рассказывают как вписать страницу 404 в шаблон, но никто не знает как организовать при этом правильный ответ сервера. По умолчанию Джумла отдает статус 302 - временно перемещено, или даже 200 - получено. А нам нужен 404 - не найдено. Решение ниже.

СОЗДАЕМ СТРАНИЦУ 404

Создаем новую статью с заголовком '404 error', публикуем её.

В текст вставляем что-то типа этого:

<h1>404 Не найдено</h1>
<p>Извините, такой страницы не найдено. Попробуйте поискать по содержанию</p>
<p><a href="/index.php?option=com_search&view=search">Поиск</a> | <a href="/">На главную страницу</a> | <a href="/component/contact/?amp;view=contact&amp;id=1&amp;Itemid=67">Контакты</a></p>

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

ДЕЛАЕМ ПУНКТ МЕНЮ

Джумла работает странно, и для того, чтобы назначить адресу алиас, нужно сделать невидимый пункт меню. Создаем новое меню, в нем делаем пункт '404' с алиасом '404-error', указывающий на нашу статью '404 error'. В настройках индексации выбираем NO INDEX, NO FOLLOW. Всё публикуем, сохряняем. Этого меню не будет нигде видно, но у нас теперь есть короткий адрес для нашей страницы 404, выглядит он так: site.ru/404-error или site.ru/404-error.html если вы включили суффиксы.

РЕДАКТИРУЕМ ШАБЛОН

В корне используемого вами шаблона должен лежать файл error.php. Если его нет, смело создаем.

Минимальное содержимое этого файла должно быть таким:

<?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();
$this->language = $doc->language;
$this->direction = $doc->direction;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<?php
if (($this->error->getCode()) == '404') {
header("HTTP/1.1  404 Not Found");   
echo file_get_contents(JURI::root().'/404-error');
exit;
}
?>

Если в файле уже есть какой-то код, попробуйте сохранить его под другим именем и заменить моей версией. Потом по аналогии добавите обработку 403 ошибки если будет нужно.

Проверяем как всё работает, набирая различную абракадабру в адресной строке и коверкая адреса страниц. Все попытки перейти по несуществующему адресу должны приводить нас на страницу сайта с нашим шаблоном и текстом из статьи '404 error'. Если это не так, и все пункты проделаны верно, проблема в отключенной переадресации, не работающих seo-урлах (алиасах) или файле .htaccess.

ЗАКРЫВАЕМ СТРАНИЦУ 404 ОТ ИНДЕКСАЦИИ

В файл robots.txt добавляем секцию

Disallow: /404-error

А теперь главное: проверяем ответ сервера! Идем на http://mainspy.ru/otvet_servera и проверяем ответ на не существующую страницу. Он должен быть HTTP/1.1 404 Not Found. Именно этого мы и добивались - поисковик или бот должен однозначно понимать, что перешел по битой ссылке и нечего здесь индексировать.

Всё работает для версии Джумлы 3.4 c установленным компонентом К2. Если у вас не завелось, пишите комментарии, постараюсь помочь.

3 Комментарии

Оставьте комментарий