Ошибка 404 возникает при заходе пользователя на страницу, которая не существует, удалена или перенесена по другому адресу.
Есть несколько вариантов настройки данной страницы:
- Использовать 404 страницу, настроенную в шаблоне (файл error.php)
- Редирект со всех страниц с 404 ошибкой на главную страницу магазина
- Создание собственной страницы с 404 ошибкой
Использование страницы с 404 ошибкой по умолчанию
В большинстве шаблонов в корневой папке находится файл error.php. В нем настроен вид страницы с 404 ошибкой.
Если шаблон хороший, то можно использовать его, но я не сторонник такого подхода. Во-первых, скорее всего, пользователь не увидит на странице привычную структуру магазина (с категориями, формой поиска и т.д.); во-вторых, дизайн страницы наверняка придется править.
Редирект на главную страницу
Это самый простой вариант. При попадании пользователя на несуществующую страницу автоматически будет срабатывать редирект на главную.
Для включения данной опции в Virtuemart > Настройки > Внешний вид нужно активировать Включить в VirtueMart обработку 404 ошибки.
Собственная страницы с 404 ошибкой
Самый правильный, на мой взгляд, вариант.
В менеджере материалов создаем новый материал с информацией об ошибке. Присваиваем категорию Uncategorized (Без категории).
Далее создаем новый пункт меню с типом Материал, выбираем созданный ранее материал.
Из поля Ссылка копируем адрес ссылки.
В корневую папку шаблона копируем файл \templates\system\error.php.
Сразу после
1 |
defined('_JEXEC') or die; |
Вставляем
1 2 3 4 |
if (($this->error->getCode()) == '404') { header('Location: /index.php?option=com_content&view=article&id=78'); exit; } |
Не забываем заменить адрес ссылки на свой.
В результате страница с 404 ошибкой будет иметь нужный нам вид.
83 комментария
denis2015
Сделал, но появилась и никак не убирается вверху надпись "Материалы". в файле /components/com_content/views/article/tmpl/default.php у параметра show_page_heading заменял 1 на 0, не помогло.
admin
Материалы - это случайно не категория материала с 404 ошибкой?
seocomby
Такая же проблема. Материалы - это не категория материала с 404 ошибкой. Uncategorised - категория материала.
admin
Если отменить правки то ошибка лишняя надпись исчезает?
На каком именно этапе она появляется?
denis2015
Решил проблему так: в файле error.php указал путь к материалу через алиас пункта меню.
Надпись "Материалы" исчезла, и вид адреса в случае срабатывания ошибки стал красивее: site.ru/404
Правда не знаю, на сколько это верно
denism300
можно узнать, как вы это сделали?
я пробовал так:
header('Location: /404');
уходит в бесконечный редирект, о чем радостно сообщает через некоторое время
BHy4eK
to: denis2015
Напишите пожалуйста как вы это реализовали?
Yura
Все сделал как описано выше - результат
1. site/contacts.html - страница отобржается
site/contacts/ - страница отображается
site/contacts/gfg - 404
2. Если зайти в товары - то при всех вариантах отображается страница
admin
Не забыли включить Включить в VirtueMart обработку 404 ошибки в Virtuemart > Настройки > Внешний вид?
Активирована ли опция Добавлять суффикс к URL в Система > Общие настройки > Сайт?
Юрий
Да все это сделал
admin
Тогда трудно сказать в чем проблема.
Пришлите ссылку на сайт.
Егор
Такая проблема. если делать ошибки с ссылках на пункты меню, то все ок с 404-ой. Если же делать ошибку в товаре, то переправляет на главную страницу магазина
Virtuemart > Настройки > Внешний вид?
Активирована ли опция Добавлять суффикс к URL в Система > Общие настройки > Сайт?
это все включено
admin
Не забыли включить обработку 404 ошибки в настройках virtuemart?
Егор
нет. несколько раз еще проверял, снимая и убирая галочку) посмотрите, если не трудно на hobbysale.by. В каталоге именно. Буду признателен за помощь
admin
В карточке товара сообщение об ошибке появляется, в категории - нет.
В чем причина, к сожалению, не могу сказать.
Егор
Все равно, спасибо за помощь)
Николай
Такая же проблема, в обычных статьях все работает, в магазине нет. Все включил, из карточки товара переходит в категорию а 404 ерор не выдает
admin
Здравствуйте!
Зашел на сайт.
Из карточки товара и со страницы категорий при изменении адреса на неправильный происходит редирект на страницу http://combicorm.ru/index.php?option=com_content&view=article&id=78
Николай
ДА все исправил уже сам, дело было в router.php. Что бы все заработало надо было в нем внести вот такие изменения :
elseif (!$helper->use_id && ($helper->activeMenu->view == 'category' ) ) {
$product = $helper->getProductId($segments ,$helper->activeMenu->virtuemart_category_id);
$vars['virtuemart_product_id'] = $product['virtuemart_product_id'];
$vars['virtuemart_category_id'] = $product['virtuemart_category_id'];
if(isset($vars['virtuemart_product_id']))
{
$vars['view'] = 'productdetails';
}
else
{
JError::raiseError(404, JText::_("Page Not Found"));
}
} elseif (isset($segments[0]) && ctype_digit ($segments[0]) || $helper->activeMenu->virtuemart_category_id>0 ) {
$vars['virtuemart_category_id'] = $segments[0];
$vars['view'] = 'category';
} elseif ($helper->activeMenu->virtuemart_category_id >0 && $vars['view'] != 'productdetails') {
$vars['virtuemart_category_id'] = $helper->activeMenu->virtuemart_category_id ;
$vars['view'] = 'category';
} elseif ($id = $helper->getCategoryId (end($segments) ,$helper->activeMenu->virtuemart_category_id )) {
// find corresponding category . If not, segment 0 must be a view
$vars['virtuemart_category_id'] = $id;
$vars['view'] = 'category' ;
} else {
JError::raiseError(404, JText::_("Page Not Found"));
$vars['view'] = $segments[0] ;
if ( isset($segments[1]) ) {
$vars['task'] = $segments[1] ;
}
Ксатит такой вопрос при редиреки на http://combicorm.ru/index.php?option=com_content&view=article&id=78 страницу роботы гугла и ящи будут считать что ответ с этой страницы 404?
admin
Спасибо, что поделились.
Проверить код ответа можно здесь http://checkmy.ru/
Smith999
Все сделал как у вас.
Все равно работает не супер.
site.ru/vibroplatformi/123 - будет правильная ошибка 404
а, если
site.ru/123/vibroplatformi/ - ошибка не загорается.
Как у вас, если вставить ложную категори, перед правильной, будет ли 404?
BHy4eK
Николай, подскажите а где лежит файл router.php ?
lexa
Подскажите пожалуйста какой кусок кода в router.php нужно заменить на предложенный вами
N1
Этот кусок кода в файле router нужно добавить или заменить вместо какого-то?
elseif (!$helper->use_id && ($helper->activeMenu->view == 'category' ) ) {
$product = $helper->getProductId($segments ,$helper->activeMenu->virtuemart_category_id);
$vars['virtuemart_product_id'] = $product['virtuemart_product_id'];
$vars['virtuemart_category_id'] = $product['virtuemart_category_id'];
if(isset($vars['virtuemart_product_id']))
{
$vars['view'] = 'productdetails';
}
else
{
JError::raiseError(404, JText::_("Page Not Found"));
}
} elseif (isset($segments[0]) && ctype_digit ($segments[0]) || $helper->activeMenu->virtuemart_category_id>0 ) {
$vars['virtuemart_category_id'] = $segments[0];
$vars['view'] = 'category';
} elseif ($helper->activeMenu->virtuemart_category_id >0 && $vars['view'] != 'productdetails') {
$vars['virtuemart_category_id'] = $helper->activeMenu->virtuemart_category_id ;
$vars['view'] = 'category';
} elseif ($id = $helper->getCategoryId (end($segments) ,$helper->activeMenu->virtuemart_category_id )) {
// find corresponding category . If not, segment 0 must be a view
$vars['virtuemart_category_id'] = $id;
$vars['view'] = 'category' ;
} else {
JError::raiseError(404, JText::_("Page Not Found"));
$vars['view'] = $segments[0] ;
if ( isset($segments[1]) ) {
$vars['task'] = $segments[1] ;
}
Николай
Спасибо проверил, получается проблема. Как вы советуете делать с редиректом на http://combicorm.ru/index.php?option=com_content&view=article&id=78 то ответ сервера HTTP/1.1 200 OK, а нам нужно что бы было HTTP/1.1 404 Page Not Found. А то много мусора будет висеть в индексе. Вопрос чего же тогда делать? Как было что бы и красиво и правильно?:-)
denis2015
а если в файле error.php сделать так:
if (($this->error->getCode()) == '404'){
header("HTTP/1.0 404 Not Found");
echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id=78');
exit;
}
Николай
Тов се заработает как надо. denis2015 спасибо!!! Я только от вашего лица выложу еще раз:
if (($this->error->getCode()) == '404') {
header("HTTP/1.0 404 Not Found");
echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id=78');
exit;
}
С правильными символами, а то народ который ctrl+c ctrl+v ругаться будет. Ну все схема работает супер!!! спасибо еще раз автору блога и всем кто поучаствовал, атрому может быть поправить статью с рабочими дополнениями!
Николай
Скажем так подведу еще итоги все это действие у меня работает на joomla 3.4 и virtuemart 3.10. Обработка в virtuemart ошибки 404 выключина, файл router.php поправлен как писал выше. Так же данный фаил поправлен для вывода "правильных" урлов в virtuemart (без SEO-суффикс). Все.
admin
Спасибо, что поделились решениями.
Егор
Сделал все как описано- появилась проблема. С товарами все работает отлично, но теперь перестали работать категории.Т.е. при открытии любой категории вылетает 404-я страница вместо списка товаров категории. Подскажите, пожалуйста, как решить проблему.Спасибо
admin
Пришлите ссылку на сайт.
Егор
hobbysale.by
admin
Очистите кеш на сайте.
Если не поможет, то без доступа к админке трудно сказать в чем проблема.
До этого все правильно работало?
Егор
До исправлений в router.php была общая проблема, т.е. вместо 404 страницы из товара или категории вылезала главная страница каталога.
Егор
очистка кэша не помогла
admin
Для категорий созданы пункты меню?
Попробуйте заменить router на стандартный.
Егор
Заменил. С ним все работает как раньше, т.е. 404-я не вылезает, а появляется стартовая страница каталога
Егор
Все работает. Не были созданы пункты меню) спасибо огромное за подсказку
Александр
Подскажите пожалуйста, у меня в Вирте нет пункта "включить обработку 404 ошибки" Почему?
admin
Точно не помню, но в virtuemart 2.6.12 этот пункт уже есть.
У Вас какая версия vm?
Попробуйте обновиться.
mrfrunze
Добрый день админ, настроил страницу 404 для сайта
http://bcplaneta.com.ua/?error=404
сайт не работает как магазин, но компонент вируемарта я не удалял!
Создал материал, создал невидиоме меню,
но страница 404 не отображается!? - отображается главная.
Что делал
- отключал в настойках вирта функ.- цию 404 - не помогло
- включал и выключал невидимое меню - не помогло
в самом файле error.php - прописал
код
if (($this->error->getCode()) == '404') {
header('Location: /index.php?option=com_content&view=article&id=18');
exit;
}
==========
то же не помагло! в чем может крыться причина? Спасибо.
admin
Здравствуйте!
error.php находится в папке с шаблоном?
Если да, то без доступа к админке сайта и доступа по ftp трудно что-то конкретное посоветовать.
Пришлите доступы на admin@virtuemart.su
RUslanka.RU
Мне тоже ничего не помогало. Помогло в конечном итоге это решение https://masterpro.ws/forum/virtuemart/4539-seo-i-virtuemart
admin
Спасибо, что поделились.
mrfrunze
выслал вам на почту доступы
Владимир
Вопрос:
У меня Joomla! 3.4.4 и VirtueMart 3.0.10.
Открываю файл router.php - но там немного не так, как писал Николай.
Алексей
Virtuemart 3.0.16 в настройках внешнего вида нет чек бокса "Включить в VirtueMart обработку 404 ошибки". как быТЬ? на что влияет редирект на главную при не существующей странице?
admin
Данная опция находится в настройках во вкладке Магазин.
Алексей
Спасибо, разобрался.
В итоге если делать вот так
Алексей
сделал вот так=
Vladimir
Этот метод не работает для php 7
Знает ли кто как сделать 404 страницу на php7?
Владимир
После обновления Joomla все заработало
Алексей
Доброго дня! Метод работает, Спасибо! Может не в тему, но вопрос в следующем:
VM 2.6.14
Если после страницы с пунктом "меню категория VM" добавит произвольную аброкадабру
Те есть site.ru/категорияVM/lkjtr547gbtr
то, будет ответ сервера 200 ОК и редирект на этот пункт меню категория VM, а не 404 ошибка, как это нужно бы по идеи.
При этом в настройках VM стоит пункт добавлять суффикс .html и если к этой аброкадабре добавить суффикс.html
Те есть site.ru/категорияVM/lkjtr547gbtr.html,
То ответ сервера будет 303 See other и редирект на категориюVM. Но на экране Показывается 404 ошибка.
Можно ли как то вылечить этот баг? Спасибо
admin
Здравствуйте!
Попробуйте способ из этого комментария
Алексей
Нет, к сожалению. Возможно потому что у меня Joomla 2.5 + VM 2.6, а метод для 3.0 и выше, как я понял.
Если после категории меню VM добавить произвольные символы без суффикса то упорно 200 ОК и редирект на это меню.
Но вот заметил если убрать в VM обработку 404 ошибки то, ответ сервера при несуществующем адресе с суффиксом будет 404, а не 303 как был до этого.
Может пригодится кому.
В любом случае Спасибо за участие.
Виталий
"В параметре Состояние выбираем Не опубликовано."
Вопрос: зачем?
Если не опубликовано - то и страница 404 не будет показываться.
admin
Верно, пункт меню нужно публиковать. Поправил в статье.
Evgen54906
Люди, подскажите как допилить выдачу ошибки 404 в virtuemart 3. Всё работает, 404 ошибка выскакивает, но не везде.
site.ru/katalog/podnosy/123/ открывается страница категории
site.ru/katalog/podnosy/123.html - открывается страница категории
Во всех остальных случаях, и на самом сайте открывается моя 404 страница.
Галочка в магазине на 404 ошибку стоит,
Своя страница 404 создана
Я так понимаю нужно править файл router.php, но что и как конкретно...
Может админ поможет? За денежку. А то замучился уже с этой 404 ошибкой...
admin
На 100% закрыть вопрос с 404 ошибкой не получается, только частично. К сожалению, помочь не смогу.
Сергей
Спасибо автору. Помогло!
Яндекс выдал Настройте возврат кода 404 на запрос несуществующих страниц.
Выполнил строго по иструкции, получилось с первого раза.
Сайт gineko.com
admin
Рад, что статья оказалась полезной.
Семён
Благодаря стараниям всех выше перечисленных наладил 404 нормально. Спасибо!
Я правда чуть другое поправил...ищем
и сразу после
ставим
И у меня вроде бы все нормально отображает.
Семён
Да, забыл написать
joomla 3.8.2 и 3.7.5
vm 3.28 и 3.21
php 7
На одном сайте в конфиге вирта включена обработка 404 ошибки, а на втором нет и там и там отдает 404 ошибку
Семён
Да, главное теперь и карточка товара при не правильном адресе выдает 404!
admin
Спасибо, что поделились.
Евгений
А в каком файле вы эту строчку ищите? Можно путь?
Спасибо!
Семён
/components/com_virtuemart/router.php
у меня это ~730 строчка
Евгений
Если не сложно, можно попросить кусок кода от if(!isset($vars['virtuemart_product_id'])) {
до
JError::raiseError(404, JText::_("Page Not Found"));
А то чёт не пойму ничего, у меня есть строка if(!isset($vars['virtuemart_product_id'])) {, но до следующего } else { очень много кода
Семён
Семён
Так я и не писал, что else идёт сразу за той строчкой, не хотелось вставлять весь код, думал народ итак разберётся...ан нет писать надо было полностью)
Евгений
Спасибо большое, друг!!
Я то разобрался, нашёл else , но побоялся, что не тот фрагмент кода я нашёл, по-этому и решил подстраховаться.
Реально, всё заработало. Всё как ты и писал, реально в карточке товара ошибка выскакивает. И если вот так сделать, как писали выше "site.ru/katalog/podnosy/123/ открывается страница категории
site.ru/katalog/podnosy/123.html - открывается страница категории"
теперь выскакивает ошибка 404.
Спасибо большое за помощь!!!!
Polad
Работает не совсем корректно.
Если категория виртуемарт опубликована как пункт меню, то все ок.
Но если октрывать подкатегорию (которая не опубликована как пункт меню), через родительскую категорию, то выдает 404.
Сергей
site.ru/katalog/kategory/tovar123/
выдаёт 404
site.ru/katalog/123kategory/tovar/
ошибку не выдаёт
123 произвольные символы для вызова ошибки
KSENIYA
Здравствуйте!
интересует как реализовать стр 404 для мультиязычности?
срабатывает(отображается) только на русский контент (меню, модули и тд)
точнее в url тег языка остается правильный а весь контент включая 404 стр отображается на русском
сам материал 404 указан для всех языков
пробовала для каждого языка делать свой материал 404, но все равно показывает только рус версию
Tvi
работающее решение по возврат 404 ошибки для собственной страницы в последнем сообщении https://joomla.stackexchange.com/questions/4566/return-404-header-with-404-page для j3.8+v3.2
admin
Спасибо, что поделились.
juicy
Такое поведение нормально для сайта?
juicy
Ой, не то сделал, напишу ручками. Если делаю ошибки в URL товара, поведение было разным:
(ошибка в категории / в подкатегории / в товаре: Поведение)
1. ок / ок / ошибка: Переход на страницу подкатегории (код стр 200)
2. ок / ошибка / ок: Переход на страницу товара (код стр 200)
3. ок / ошибка / ошибка: Переход на страницу категории (код стр 200)
4. ошибка / ок / ок: Открывается стр товара на главной (код стр 200)
5. ошибка / ок / ошибка: Страница 404 (код стр 404)
6. ошибка / ошибка / ок: Открывается стр товара на главной (код стр200)
7. ошибка / ошибка / ошибка: Страница 404 (код стр 404)
Это нормально? у вас также?
admin
Посмотрите в комментариях, там приводились примеры решения.
В vm 3.4.2 вроде эта проблема более менее решена, у Вас какая версия?
juicy
Joomla 3.9.1 Virtuemart 3.4.2
admin
Вы отключили обработку 404 ошибки в virtuemart и внесли правки в error.php?
juicy
Да, не помогло
admin
Других вариантов, к сожалению, предложить не могу.