
Ошибка 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
Важно: имя каталога у другого шаблона будет отличаться. Если у вашего шаблона есть child-template, используйте его. Перед редактированием обязательно сохраните резервную копию.
Готовый error.php для Joomla 5 и 6
Ниже приведён вариант, который используется на StimylRosta. Он не делает перенаправлений, сохраняет реальный HTTP-код ошибки и автоматически выводит русский или украинский текст в зависимости от языка сайта.
<?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, короткое объяснение и кнопку возврата на главную.

На украинской версии тот же error.php автоматически выводит локализованный текст.

Как проверить, что сервер действительно возвращает 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. После изменения обязательно проверьте код ответа сервера — именно он определяет, является ли страница технически корректной.