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

Дефолтная джумловская страница 404 не вписана в шаблон и загромождена кучей малоинтересной для посетителя технической информации:

default-page-404

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

Цель: создать информативную страницу (в случае мультиязычности - для каждого из языков), сохранив структуру сайта, но при этом сделать ее отдельной - убрать навигацию Предыдущая - Следующая, не выводить хлебные крошки, кнопки соцсетей, но оставить комментарии. Также убираем всю инфу об авторе, дате создания, количестве просмотров (последнюю - особенно! ;)). При этом в адресной строке должен оставаться неверный адрес, вбитый посетителем.

К слову, некто Артемий Лебедев настаивает, что, цитирую, "нельзя допускать, чтобы несуществующую страницу путали с обычной. Поэтому на странице с ошибкой не должно быть основного меню сайта, верстки и цветов типовой страницы". Ну, не знаю. Можно, конечно, отвязать модуль главного меню по тому же принципу, что описан здесь для модуля навигатора, а также соорудить отдельный шаблон для страницы ошибки. Я предпочел этого не делать, поэтому в дальнейшем останавливаться на этом не буду.

Итак, перейдем к процессу. Отмечу лишь, что, как автор двуязычного сайта на момент написания (а в дальнейшем не исключаю добавления новых языков), код страницы ошибки я сваял с учетом многоязычности. Описывать процесс буду только для одного языка (в моем примере - русского), для возможных остальных он должен быть просто повторен с заменой суффикса ru на соответствующий.

Поэтапно и пошагово:

Этап 1: Создание и подключение страниц 404 для каждого языка сайта.

  1. Создаем категорию 404-ru. Язык категории, соответственно - Русский. Сохраняем.
  2. Создаем новый материал. Название на каждом из языков можно задавать просто 404, разниться они будут идентификаторами материалов. Категорию для данного выбираем 404-ru. Язык - опять же Русский. В текст материала вносим симпатичное и информативное содержимое, создать которое вам помогает ваша креативная фантазия. Во вкладке Параметры отображения материала | Article Options - скрываем все, что можно:
  3. article-options

  4. Жмем Сохранить | Save. Генерируется ID материала - запоминаем его:

article-id

  1. Редактируем джумловский файл ошибки 404. Его расположение: [корень_сайта]\templates\system\error.php. Удаляем содержимое файла и копируем в него следующий код:
<?php
defined('_JEXEC') or die;
$errpages_by_lang = array(
  array('language'=>'ru-Ru', 'lang'=>'ru', 'page'=>'80'),
  array('language'=>'en-Gb', 'lang'=>'en', 'page'=>'448')
);
$cur_language = JFactory::getDocument()->language;
$sef_is_on = &JFactory::getConfig()->sef == 1;
for ($i=0, $n=sizeof($errpages_by_lang); $i<$n; $i++) {
  if (strtolower($errpages_by_lang[$i]['language']) == strtolower($cur_language) || $i == $n-1) {
    if ($sef_is_on)
      echo file_get_contents(JURI::root().$errpages_by_lang[$i]['lang'].'/'.$errpages_by_lang[$i]['page']);
    else
      echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id='.$errpages_by_lang[$i]['page'].'&lang='.$errpages_by_lang[$i]['lang']);
    break;
  }
}
?>

Ключ 'page' в массиве каждого языка содержит ID материала. Заменяете в нем мой (80) на ваш, запомненный на предыдущем этапе. Остановлюсь подробнее, какие значения присваиваются ключам 'language' и 'lang'. Идем в меню Расширения | Extensions -> Менеджер языков | Language Manager -> Языки контента | Content. Там кликаем на соответствующий язык, открывая тем самым страницу редактирования языка. В типичном виде она выглядит так:

content-language

Из нее и заполняем массив. Ключ 'language' принимает значение параметра Тег языка | Language Tag, 'lang' соответствует параметру Код языка для URL | URL Language Code. При необходимости отредактируйте значения этих двух ключей для каждого языка в соответствии с вашими настройками.

Сохраняем изменения в файле error.php. Если сайт одноязычный - следующий пункт пропускайте.

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

copy-article

Редактирование файла ошибки, понятно, включает теперь только добавление (или изменение) массива нового языка как элемента массива языков и редактирование ключей. 448 - ID моей английской страницы 404, меняете как и прежде на свой. Ну и с тегами языка соответственно.

Итак, страницы 404 для всех языков сайта созданы и подключены. Для тестирования наберем в адресной строке проводника что-нибудь вроде http://ogri.me/несуществующая страница. Редирект на нашу кастомную страницу ошибки работает. Переходим к следующему этапу.

Этап 2: Настройка интерфейса страниц 404.

  1. Навигации нет как класса, поскольку наш материал - единственный в категории. Но вот хлебные крошки здесь абсолютно ни к чему. Как убрать их с определенной страницы, подробно описано в статье Joomla 2.5: Убираем хлебные крошки с выбранных страниц как раз на примере страницы ошибки 404.
  2. Оставить ли кнопки социальных сетей - каждый решает для себя сам. Возможно, вы сделаете настолько красивую 404-ю страницу, что восторженный посетитель захочет запостить линк на нее как на образец. Я же предпочитаю убрать и их, чтобы заблудившийся читатель моего ресурса не задерживался здесь, а поскорее переходил к основному контенту. Поскольку, как я уже писал, я встраиваю соцкнопки ручками, так же ручками я их выборочно отключаю. Методика описана в статье Кнопки социальных сетей в Joomla 2.5. Выборочное размещение. Кто использует плагины от сторонних производителей, должен найти в них соответствующую опцию (буде таковая есть) или влезть в код и внести свои изменения.
  3. А вот комментарии подключить, на мой взгляд, полезно. В тексте страницы также можно предложить промахнувшемуся страницей путешественнику высказать в них свое "фе". В JComments - просто добавляем категории 404-ru и 404-en раздельно по языкам в список Настройки | Settings -> Общие | General -> Категории | Categories -> Включить комментарии в категориях | Choose categories for JComments to work in. Как в других компонентах комментариев - не знаю, не пользовался и не планирую: JComments - однозначно лучший.

Теперь отдельно - об одном неприятном моменте, с которым я столкнулся во время тестирования, и упоминание о котором не встречал в статьях на данную тему. Если в неверном адресе страницы присутствует одинарная кавычка, вылетает Fatal error типа "Неотработанное исключение". Возможно, в новых версиях Джумлы это поправят, а пока пришлось вставить костыль, благо сообщение о фатальной ошибке вполне информативно и наводит на файл (\libraries\joomla\environment\uri.php) и номер строки в нем (194), где собака порылась. Открываем файл на редактирование, находим следующий фрагмент кода:

// Check for quotes in the URL to prevent injections through the Host header
if ($theURI !== str_replace(array("'", '"', '<', '>'), '', $theURI))
{
    throw new InvalidArgumentException('Invalid URI detected.');
}

Из него ясно, что в случае, когда URL включает одинарные или двойные кавычки, а также символы < или >, обрамляющие теги в маркапе HTML, генерируется то самое исключение. При этом, когда я пробовал вбивать ", < или >, меня вообще выбрасывало в Error 403 - Access forbidden. Я заменил вышеприведенный кусок кода на единственную строку:

$theURI = str_replace(array("'", '"', '<', '>'), '', $theURI);

То есть вместо проверки на вредные символы и выбрасывания исключения просто удалил их из адреса. Теперь даже при наличии их в URL откроется наша кастомная 404-я страница. При этом в адресной строке браузера всё введенное пользователем остается без изменения, что хорошо: он даже не догадывается о наших манипуляциях.

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

Комментарии  

Карина
+3 # Карина 30.10.2013 11:02
Ув. автор, у меня к вам такой вопрос.
Когда вы попадаете на страницу 404, и не уходя с нее пытаетесь авторизоваться на сайте, выдается ошибка "Неверный параметр" на белом экране.
Как решить эту ошибку?
(На вашем сайте она тоже есть.)
Ответить | Ответить с цитатой | Цитировать
Ogri
+3 # Ogri 30.10.2013 16:31
Ув. Карина, вы правы. Есть такой эффект. Может быть, выберу время - поковыряю. Пока же отвязал модуль авторизации от страниц ошибок вручную. Возможно, это самое лучшее и простое решение замеченного вами побочного эффекта. Обязательно дополню статью, спасибо вам за внимательность и наводку.
Ответить | Ответить с цитатой | Цитировать
Сергей
0 # Сергей 17.06.2014 04:46
Здравствуйте.
Я просто скопировал главную страницу в файл error.php, получилось сообщение об ошибке не нарушая общий вид сайта, можно посмотреть: http://sohranay.ru или http://stroydostavka54.ru
Ответить | Ответить с цитатой | Цитировать
Мария
-2 # Мария 17.06.2014 04:57
Спасибо за статью . Познавательно ! А вот здесь можно посмотреть интересное решение для 404 страницы http://kvinta-a.ru/stranitsa-404/
Ответить | Ответить с цитатой | Цитировать
Андрей
0 # Андрей 23.07.2014 14:46
В коде не хватает запятой после определения второго языка.
Ответить | Ответить с цитатой | Цитировать
Ogri
+1 # Ogri 23.07.2014 15:11
После последнего элемента массива запятая, как известно, является опциональной.
Ответить | Ответить с цитатой | Цитировать
jeriki
0 # jeriki 28.05.2015 04:36
Здравствуйте! Все сделала по инструкции и все работает. Спасибо большое! Но есть один нюанс. У меня отображается сначала заголовок Материалы, а лишь потом написанный текст. Joomla 2.5.6. В параметрах отображения материала все скрыто. Как это можно исправить? Заранее благодарю за ответ:)
Ответить | Ответить с цитатой | Цитировать
Ogri
+1 # Ogri 28.05.2015 11:32
У меня тоже такое было. Нашел тогда в Сети решение: в файле \languages\ru-RU.ini находим строку JGLOBAL_ARTICLES="Материалы" и заменяем на JGLOBAL_ARTICLES="". То же для остальных языков в случае мультиязычного сайта. Так и тянул, восстанавливая это изменение после каждого обновления языковых пакетов. Как перешел на третью Джумлу, надобность в редактировании ru-RU.ini пропала сама собой - видимо, это был баг, который разработчики исправили в новой версии CMS.

Вы ипользуете Joomla 2.5.6 сейчас, когда последний билд второй с половиной Джумлы - 2.5.28 (и он последний во всех смыслах - разработка и поддержка 2.5 прекращены с декабря прошлого года). Значит, вы не обновляетесь. Понятно, что почти в каждом обновлении разработчики, исправляя старые баги, вносят новые, зачастую еще более жестокие. В 2.5.17 они напортачили с роутером и не исправляли в нескольких следующих. После обновлений приходилось возвращать роутер из 2.5.16, иначе сбивались многие ссылки. Обновления - головняк тот еще, но без них еще хуже: уязвимости в безопасности старых версий давно известны, трояны, их использующие, толпами кишат в Сети. Рано или поздно вас хакнут, как дважды хакнули меня в свое время.

Я бы на вашем месте обновился как минимум до 2.5.28, а как максимум - перешел бы на третью Джумлу. В Инете полно информации на эту тему, я сам сейчас готовлю статью по миграции с 2.5 на последний билд тройки. Попробуйте для начала 2.5.28. Естественно, прежде чем переносить изменения на реальный хостинг, тестируйте тщательно на локальном.
Ответить | Ответить с цитатой | Цитировать
jeriki
0 # jeriki 02.06.2015 08:55
Спасибо большое! Рекомендация помогла:) Все получилось) А вот идею обновления я вынашиваю, но все пока что не решусь:) Одно лечим - другое калечим :lol: . Именно это и пугает.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 03.06.2015 01:45
Совершенно верно. Но рано или поздно придется. Переходите от вынашивания к планированию :-)
Ответить | Ответить с цитатой | Цитировать
Иван
0 # Иван 22.06.2016 03:54
Такая же проблема была в Joomla 3.4.3
Предложенное решение отлично работает.
Спасибо!
Ответить | Ответить с цитатой | Цитировать
appleflower
0 # appleflower 14.08.2015 14:40
Здравствуйте Олег. У меня вопрос по поводу модуля JCOMMENTS. Установила на joomla 2.5.4 настроила. Но при заполнении формы на странице кнопка "Отправить" не работает. И комментарии не появляется. Помогите, в чем может быть проблема?
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 15.08.2015 05:04
Здравствуйте. Проблема может быть в чем угодно. Навскидку сказать не могу. Могу зайти через TeamViewer и попробовать разобраться. Если согласны, пишите в личку. Верхнее меню, обратная связь.
Ответить | Ответить с цитатой | Цитировать
Ирина
0 # Ирина 06.03.2016 15:43
Спасибо, за статью.! В очередной раз воспользовалась инструкцией на очередном сайте и все Ок? 404 страница работает!
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 06.03.2016 17:00
Ирина, на здоровье! Но публиковать в таком контексте адрес сайта не стану - ваша благодарность очень явно выглядит лишь поводом разместить ссылку. Поэтому убил ее, уж извините.
Ответить | Ответить с цитатой | Цитировать
Иван
0 # Иван 22.06.2016 02:52
Ув. автор, спасибо за интересный вариант решения данной проблемы.
Но, столкнулся с одной проблемкой - как настроить тайтл этой страницы?
Joomla 3.4.3
http://restoraneva.ru/
Ответить | Ответить с цитатой | Цитировать
Mitchel
0 # Mitchel 21.09.2021 08:06
Everything is very open with a clear explanation of the challenges.
It was definitely informative. Your website is very helpful.
Thank you for sharing!

Also visit my web-site - fq - Mitchel,
Ответить | Ответить с цитатой | Цитировать
кошелек для женщины
0 # кошелек для женщины 28.07.2022 16:29
I do agree with all of the ideas you have presented in your post.

They are very convincing and will definitely work. Nonetheless, the posts are very quick for
newbies. May just you please extend them a little from next time?
Thank you for the post.
Ответить | Ответить с цитатой | Цитировать
rogertechnology.ru/
0 # rogertechnology.ru/ 08.09.2022 05:20
Pretty! This was an incredibly wonderful article. Thank you for providing
this information.
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


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