Сторінка помилки 404 у Joomla 5 і 6: створення та налаштування

Сторінка помилки 404 у Joomla 5 і 6

Помилка 404 означає, що сервер доступний, але запитаної сторінки за вказаною адресою немає. Це нормальна ситуація: матеріал могли видалити, URL міг змінитися, користувач міг помилитися під час введення адреси або перейти за застарілим посиланням.

Головне — не намагатися маскувати таку ситуацію звичайною сторінкою з кодом 200 або перенаправляти всі невідомі URL на головну. Для справді неіснуючої сторінки сервер має повертати HTTP 404, а відвідувач при цьому може бачити охайну й корисну сторінку в дизайні сайту.

Коли потрібен 404, а коли 301 редирект

Якщо старий матеріал справді переїхав на новий URL і має прямий аналог, краще налаштувати 301 редирект. Якщо відповідної заміни немає, URL має повертати 404. Для навмисно й остаточно видаленого ресурсу також може використовуватися 410 Gone.

Не варто перенаправляти всі помилкові адреси на головну або на один універсальний матеріал «Сторінку не знайдено». Така схема здатна створити soft 404: користувач бачить повідомлення про помилку, а сервер фактично відповідає кодом 200 або перенаправленням.

Як влаштована сторінка 404 у Joomla 5 і 6

Joomla виводить системні помилки через файл error.php активного шаблону. Якщо використовується дочірній шаблон, власний error.php краще розміщувати саме в ньому — так зміна не втратиться під час оновлення батьківського шаблону. Точна назва каталогу залежить від шаблону, тому загальний шлях має такий вигляд:

/templates/ім’я_дочірнього_шаблону/error.php

Файл error.php у дочірньому шаблоні Joomla

Важливо: назва каталогу в іншого шаблону відрізнятиметься. Якщо ваш шаблон має child-template, використовуйте його. Перед редагуванням обов’язково збережіть резервну копію.

Готовий error.php для Joomla 5 і 6

Нижче наведено варіант, який використовується на StimylRosta. Він не робить перенаправлень, зберігає реальний HTTP-код помилки й автоматично виводить російський або український текст залежно від мови сайту.

error.php
<?php

defined('_JEXEC') or die;

$code = isset($this->error) ? (int) $this->error->getCode() : 500;

if ($code < 400 || $code > 599) {
    $code = 500;
}

http_response_code($code);

$language = strtolower((string) ($this->language ?? 'ru-ru'));
$isUk = str_starts_with($language, 'uk');

if ($code === 404) {
    $heading = $isUk ? 'Сторінку не знайдено' : 'Страница не найдена';

    $text = $isUk
        ? 'Можливо, сторінку було видалено, переміщено або адресу введено з помилкою.'
        : 'Возможно, страница была удалена, перемещена или адрес введён с ошибкой.';
} else {
    $heading = $isUk ? 'Сталася помилка' : 'Произошла ошибка';

    $text = $isUk
        ? 'Не вдалося відкрити запитану сторінку. Спробуйте повернутися на головну.'
        : 'Не удалось открыть запрошенную страницу. Попробуйте вернуться на главную.';
}

$homeLabel = $isUk ? 'На головну' : 'На главную';
$homeUrl   = $isUk ? '/uk/' : '/';

?>
<!doctype html>
<html lang="<?php echo $isUk ? 'uk' : 'ru'; ?>">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title><?php echo $code; ?> — <?php echo htmlspecialchars($heading, ENT_QUOTES, 'UTF-8'); ?></title>

    <style>
        * {
            box-sizing: border-box;
        }

        html,
        body {
            margin: 0;
            min-height: 100%;
        }

        body {
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 32px 20px;
            background: #f6f2ec;
            color: #252525;
            font-family: Arial, Helvetica, sans-serif;
        }

        .error-page {
            width: 100%;
            max-width: 720px;
            text-align: center;
        }

        .error-logo {
            display: inline-block;
            margin-bottom: 48px;
            color: #252525;
            font-size: 20px;
            font-weight: 700;
            letter-spacing: 0.08em;
            text-decoration: none;
        }

        .error-code {
            margin: 0;
            font-size: clamp(88px, 16vw, 160px);
            line-height: 0.9;
            font-weight: 500;
            color: #208754;
        }

        .error-title {
            margin: 28px 0 16px;
            font-size: clamp(28px, 5vw, 42px);
            line-height: 1.2;
            font-weight: 500;
        }

        .error-text {
            max-width: 590px;
            margin: 0 auto;
            font-size: 18px;
            line-height: 1.65;
            color: #555;
        }

        .error-actions {
            margin-top: 34px;
        }

        .error-home {
            display: inline-block;
            padding: 12px 24px;
            border: 1px solid #208754;
            border-radius: 5px;
            background: #208754;
            color: #fff;
            font-size: 17px;
            line-height: 1.4;
            text-decoration: none;
            transition: opacity 0.2s ease;
        }

        .error-home:hover,
        .error-home:focus {
            color: #fff;
            opacity: 0.88;
        }

        @media (max-width: 600px) {
            .error-logo {
                margin-bottom: 36px;
            }

            .error-text {
                font-size: 16px;
            }
        }
    </style>
</head>

<body>
    <main class="error-page">
        <a class="error-logo" href="/<?php echo $homeUrl; ?>">STIMYLROSTA</a>

        <p class="error-code"><?php echo $code; ?></p>

        <h1 class="error-title">
            <?php echo htmlspecialchars($heading, ENT_QUOTES, 'UTF-8'); ?>
        </h1>

        <p class="error-text">
            <?php echo htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); ?>
        </p>

        <div class="error-actions">
            <a class="error-home" href="/<?php echo $homeUrl; ?>">
                <?php echo htmlspecialchars($homeLabel, ENT_QUOTES, 'UTF-8'); ?>
            </a>
        </div>
    </main>
</body>
</html>

Що робить цей код

Ключовий рядок — http_response_code($code);. Він повідомляє браузеру й пошуковим роботам справжній статус відповіді. Якщо URL не існує, Joomla передає код 404, і відвідувач бачить оформлену сторінку, але для пошукової системи вона, як і раніше, залишається коректною помилкою 404.

Змінна $language визначає мову поточної сторінки. Для української версії використовуються тексти «Сторінку не знайдено» та «На головну», для російської — «Страница не найдена» і «На главную». Якщо у вас інші мови або інші мовні префікси, цей блок потрібно змінити під структуру свого сайту.

Код також обробляє системні помилки діапазону 400–599. Якщо коректний код отримати не вдалося, використовується 500, а не хибний 200.

Як виглядає готова сторінка 404

У російській версії відвідувач отримує просту сторінку без зайвих модулів: логотип, великий код 404, коротке пояснення й кнопку повернення на головну.

Російська сторінка помилки 404 у Joomla 5 і 6

В українській версії той самий error.php автоматично виводить локалізований текст.

Українська сторінка помилки 404 у Joomla 5 і 6

Як перевірити, що сервер справді повертає 404

Красивого повідомлення «Сторінку не знайдено» недостатньо. Після зміни error.php відкрийте будь-яку гарантовано неіснуючу адресу й перевірте HTTP-код відповіді через інструменти розробника браузера або сервіс перевірки статусу URL.

Результат має бути:

HTTP 404 Not Found

На StimylRosta було перевірено обидві мовні версії: російський та український тестові URL повернули справжній код 404. Перевірити це можна на вкладці Network (Мережа) інструментів розробника браузера: основний запит повинен мати статус 404.

Чи потрібно створювати окремий матеріал «Помилка 404»

Для описаного способу — ні. У старих інструкціях для Joomla часто радили створити звичайний матеріал, приховати його від індексації та перенаправляти на нього помилки через error.php. Такий підхід ускладнює налаштування й легко призводить до неправильного коду відповіді.

Сучасний варіант простіший: неіснуючий URL залишається тим самим, сервер повертає 404, а error.php лише визначає, що побачить відвідувач.

Чи потрібно закривати сторінку 404 у robots.txt

Немає потреби додавати універсальну 404-сторінку до robots.txt. Пошуковому роботу важливо мати можливість звернутися до неіснуючого URL і побачити справжній HTTP 404. Сам код відповіді вже повідомляє, що сторінку не потрібно індексувати.

Якщо Search Console показує 404 для справді видалених або помилково введених URL, це саме по собі не означає проблему сайту. Виправляти потрібно насамперед биті внутрішні посилання та URL, для яких існує актуальна заміна.

Якщо після створення error.php з’являється помилка 500

Спочатку тимчасово поверніть попередній файл і перевірте синтаксис PHP. Особливу увагу приділіть лапкам, крапкам із комою та сумісності коду з версією PHP на сервері.

В Astroid не варто наосліп копіювати вміст батьківського error.php у дочірній шаблон. У нашому випадку батьківський файл передавав виведення системної помилки внутрішньому механізму Astroid, а його пряме копіювання в child-template призводило до 500. Автономний файл вище усуває цю залежність.

Підсумок

Правильна сторінка 404 у Joomla 5 і 6 має розв’язувати два завдання одночасно: зрозуміло пояснювати відвідувачеві, що запитану адресу не знайдено, і повертати пошуковим системам справжній HTTP 404.

Для цього достатньо власного error.php в активному дочірньому шаблоні. Не потрібно створювати окремий матеріал, перенаправляти всі помилки на головну або закривати 404 у robots.txt. Після зміни обов’язково перевірте код відповіді сервера — саме він визначає, чи є сторінка технічно коректною.

Add comment

Знайшли помилку або неточність?

Выделите фрагмент текста и нажмите Ctrl + Enter. Также можно воспользоваться кнопкой ниже.

Знайшли помилку або неточність?

Виділений фрагмент буде додано до повідомлення автоматично. За потреби додайте пояснення.

Форма захищена від автоматичних надсилань

Дані використовуються лише для перевірки та виправлення матеріалу.