При попытке вызова страницы с несуществующей категорией или товаром VirtueMart 2 не выдает страницу ошибки 404. Связано это с особенностями реализации роутера. Но для целей СЕО желательно, чтобы на отсутствующие страницы VirtueMart реагировал выдачей стандартной страницы 404.

Здесь рассматривается случай с VirtueMart 2.0.18a, но решение актуально и для других версий. Это частное решение в моем случае работает для категорий и товаров, для других элементов, возможно, нужные дополнительные изменения.

В файле /componetns/com_virtuemart/router.php ищем функцию virtuemartParseRoute, в конце функции последний блок if-else, строки (~597)

} elseif (!$helper->use_id && ($helper->activeMenu->view == 'category' ) )  {
        $vars['virtuemart_category_id'] = $helper->getCategoryId (end($segments) ,$helper->activeMenu->virtuemart_category_id);
        $vars['view'] = 'category' ;

Делаем следующие изменения:

} elseif (!$helper->use_id && ($helper->activeMenu->view == 'category' ) )  {
        JError::raiseError(404, JText::_("Page Not Found"));

Дальше, ищем строки:

} else {
        $vars['view'] = $segments[0] ;
        if ( isset($segments[1]) ) {
            $vars['task'] = $segments[1] ;
        }

Меняем так:

} else {
        JError::raiseError(404, JText::_("Page Not Found")); 
        }