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


На первый взгляд, задача простая и описана на официальном сайте Joomla

https://docs.joomla.org/Creating_a_Custom_404_Error_Page/ru

Только вот незадача. Если в общих настройках Joomla включен SEF, то обработка 404 происходит весьма своеобразно и предлагаемый по ссылке рецепт срабатывает далеко не всегда.
 

Симптомы некорректно работающего сайта

Как работал сайт заказчика?

 

  1. При вводе неверного адреса на странице категории, открывалось содержимое главной страницы сайта. При этом адрес страницы не менялся

  2. При вводе неверного адреса на странице товара открывался контент категории, к которой относился товар. При этом адрес страницы не менялся
     

Почему необходимо решать проблему

Признаюсь, я никогда серьезно не задумывался над 404 ошибкой в Joomla и над механизмом работы SEF адресов в целом.

При тестировании на локальном компьютере, где не был установлен Virtuemart, обнаружил, что работа происходит аналогично. Также, как и на сайте заказчика

Затираем часть адреса и видим, что отображается главная страница, либо категория, к которой относится материал, либо вообще ничего не происходит. Контент остается прежним.

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

Конечно, есть мощные компоненты, которые с тем или иным успехом сражаются с дублями страниц и решают множество задач для правильного представления сайта в поисковых системах. Однако, как показывает опыт, лучше стараться избегать подобных комбайнов по обработке адресов страниц. Это создает немало проблем, особенно с таким компонентом, как Virtuemart

 

Анализ ситуации

Понять, что происходит с точки зрения системы можно проанализировав переменные запроса Joomla

Чтобы не вываливать на экран все переменные запроса Joomla, вставим следующие строчки, например, в файл index.php шаблона сайта

Данный фрагмент кода позволит нам вывести на экран массив переменных, содержащийся в адресной строке:
 

$uri = JURI::getInstance();

$appsite = JFactory::getApplication('site');

$router = $appsite->getRouter();

$getParams = $router->parse($uri);

echo '<pre>'; print_r ($getParams); echo '</pre>';

При вводе неверного адреса мы увидим, что никакой 404 ошибкой и не пахнет.

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

 

К примеру:

  • Если неверный адрес введен на странице материала стандартного com_content, то , собственно, ничего и не меняется кроме содержимого адресной строки браузера.
  • Если неверный адрес введен на странице категории, то содержимое сайта меняется на содержимое главной страницы.

 

Какую то закономерность вычислить мне было сложно, да это и не нужно.

 

Решение проблемы


Те, кто изучал вопрос , знают: у каждого компонента в Joomla есть свой роутер, где исходя из получаемых данных формируется SEF адрес страницы.

Подробнее о роутинге можно почитать на этой страничке:

http://inet-reklama.com/blog/joomla/routing-v-joomla-jroute.html


Для себя я задачу сформировал так:


Если содержимое адресной строки не соответствуют тому, что показывают переменные запроса, то осуществляем редирект на 404 страницу.


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

Называется он redirect_virtuemart

Скачать плагин можно по ссылке ниже:
 

https://sitogon.ru/files/plg_redirect_virtuemart.zip
 

Как работает плагин?

В настройках плагина выбирается статья из менеджера материалов Joomla. На нее будет осуществляться редирект при неверном вводе адреса страницы.


 



 

Включенный плагин отслеживает соответствие адреса страницы переменным, которые отдает система. Если соответствие нарушено, то осуществляется редирект.


 

В каких случаях не будет работать плагин

В начале статьи я давал ссылку на документацию с официального сайта Joomla, где говорилось о том, как создать 404 страницу

Так вот игнорировать эту документацию не стоит, поскольку плагин не обрабатывает 404 ошибку. Он просто ищет несоответствие получаемым из Joomla данным и текущего адреса страницы.

Если в общих настройках вашего сайта параметр «Добавлять суффикс к URL» включен в положение «ДА», то адрес ваших страничек будет таким:

http://localhost/magazin.html


Если убрать пару символов из «html», то мы получим в адресной строке следующий адрес:


http://localhost/magazin.ht


И Joomla честно обработает такой адрес, как 404 ошибку. В данном случае редирект необходимо осуществлять методом, который описан в документации на официальном сайте Joomla


 

В каких случаях не будет редиректа на 404 страницу


Если на странице товара Virtuemart затереть часть адреса, в которой расположен алиас товара, то произойдет редирект на страницу категории


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

Плагин осуществляет проверку адреса без дополнительных параметров. Если адрес будет выглядеть так:
 

http://localhost/redaktirovat-profil.html?view=login
 

То все, что идет после вопросительного знака учитываться в сравнении не будет
 

Плагин не осуществляет работу для компонента com_users

 

Breadcrumbs (хлебные крошки) и Virtuemart


Когда плагин был практически доделан, я обнаружил одну странность. Адрес категории Virtuemart отличался, если заходить через меню или если заходить через клик в модуле Breadcrumbs. Это же касалось и страницы производителей

Пришлось добавить редирект от «неправильного» адреса Breadcrumbs, в тот, который формируется пунктом меню
 

Заключение

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