Кастомная 404-страница: как настроить и реализовать правильно
Как вернуть настоящий 404, не подавать сигналов soft 404 и дать посетителям полезный путь назад во фреймворках и в конфигурации сервера.
Когда пользователь переходит по битой ссылке, сервер должен вернуть статус 404 Not Found. Но в реальных проектах это правило нарушают на удивление часто: CMS отдаёт 200 OK, редирект ведёт на главную или страница «404» технически возвращает правильный код, но выглядит как пустой экран. Каждая из этих ситуаций — отдельная проблема и для SEO, и для пользователя.
Правильно настроенная 404-страница решает сразу три задачи: сообщает Google, что URL не существует; удерживает пользователя на сайте и помогает найти нужный раздел; защищает краулинговый бюджет от впустую потраченных проходов. Разберём каждый аспект по порядку.
Что такое 404-страница
404 Not Found — HTTP-код ответа, который сервер возвращает, когда запрошенный ресурс не существует. Код означает, что сервер работает нормально и маршрут найден, но запрошенного документа нет. Так 404 отличается от 500 (ошибка сервера) и 503 (сервис недоступен).
Сайтов без своей 404
Большинство сайтов показывают стандартную 404 платформы вместо брендированной страницы с навигацией
Время до исключения из индекса
Google обычно удаляет корректную 404 из индекса за несколько недель. Ускорить можно через Search Console
Самая частая ошибка
CMS отдаёт 200 OK вместо 404 — Google индексирует пустые страницы и размывает тематику сайта
Удаляется быстрее
Google удаляет 410 (Gone) из индекса заметно быстрее, чем 404 — используйте его при массовом удалении страниц
404-страница существует на двух уровнях. HTTP-уровень — это код ответа в заголовке, который видит поисковый робот. Визуальный уровень — это HTML-контент, который видит пользователь. Оба уровня одинаково важны: неверный HTTP-код — проблема для SEO, слабый дизайн — проблема для UX.
Главное правило: всегда возвращать HTTP 404
Первое и самое важное правило: страница с ошибкой должна возвращать HTTP-статус 404 (или 410), но никогда не 200. Это называют «жёсткой 404» (hard 404) в отличие от «мягкой 404» (soft 404).
Проверить HTTP-статус любой страницы можно прямо в браузере: F12 → Network → перезагрузить страницу → первый запрос → колонка Status. Или через curl в терминале:
# Check HTTP status of a page
curl -s -o /dev/null -w "%{http_code}" https://example.com/non-existent-url
# Expected output: 404
# Check full response headers
curl -I https://example.com/non-existent-urlSoft 404 и 410: в чём разница
Помимо «жёсткой 404» есть два смежных случая, которые на практике часто путают: soft 404 и статус 410. Разница между ними важна для правильной работы с удалёнными страницами.
| Статус | HTTP-код | Что это значит для Google | Когда использовать |
|---|---|---|---|
| Жёсткая 404 (hard 404) | 404 | Ресурс не найден; Google удалит из индекса за несколько недель | Страница удалена или никогда не существовала |
| Мягкая 404 (soft 404) | 200 (ошибка!) | Google видит «успешный» ответ и индексирует пустой контент | Никогда — это ошибка реализации, а не осознанный выбор |
| Gone | 410 | Ресурс удалён навсегда; Google исключает его из индекса заметно быстрее, чем 404 | Массовое удаление страниц (старые товары, устаревшие разделы) |
Google также относит к soft 404 редиректы с URL 404 на главную страницу или на другую нерелевантную страницу. Для поисковика это выглядит так: пользователь искал A, попал на B, а содержимое B не отвечает на запрос. Так снижается сигнал качества страницы-цели.
Что должна содержать хорошая 404-страница
Пользователь, попавший на 404, уже немного раздражён. Задача страницы — снять это раздражение и дать понятный следующий шаг. У эффективной 404-страницы узнаваемая структура.
Понятное сообщение об ошибке
Объясните ситуацию простым языком: «Страница не найдена» или «Такой страницы, похоже, не существует». Не используйте технический жаргон и коды ошибок в видимом тексте.
Строка поиска
Самый эффективный элемент 404-страницы. Пользователь уже знает, что ищет, — дайте ему найти нужное прямо здесь, без возврата в Google.
Навигация по ключевым разделам
Ссылки на главную, популярные разделы или карту сайта помогают сориентироваться и продолжить путь по сайту.
Кнопка «Назад»
Многие пользователи хотят вернуться туда, откуда пришли. Ссылка или кнопка «Назад» снижает показатель отказов и улучшает UX.
Чего не делать на 404-странице: автоматически перенаправлять пользователя на главную через JavaScript (window.location.href = '/'). Google может счесть это soft 404: пользователь ждал A, получил B, и содержимое нерелевантно. Серверные 301-редиректы с URL 404 уместны только тогда, когда есть реальная страница-замена.
Реализация: Next.js, Nginx, Apache
Как настроить кастомную 404-страницу, зависит от стека. Разберём три самых распространённых варианта: Next.js App Router, Nginx и Apache.
Next.js App Router
В Next.js 13+ с App Router кастомная 404-страница создаётся файлом not-found.tsx внутри папки app/. Для i18n (например, с next-intl) файл лежит в app/[locale]/.
// app/[locale]/not-found.tsx
import Link from 'next/link';
export default function NotFound() {
return (
<main style={{ textAlign: 'center', padding: '4rem 1rem' }}>
<h1>404 — Page Not Found</h1>
<p>The link may be outdated or the address was mistyped.</p>
<Link href="/">Back to homepage</Link>
</main>
);
}
// Next.js automatically returns HTTP 404 for this file.Для программной генерации 404 (например, в динамическом роуте app/[locale]/blog/[slug]/page.tsx) используйте функцию notFound() из next/navigation. Её вызов сразу прекращает рендеринг, возвращает HTTP 404 и выводит not-found.tsx.
// app/[locale]/blog/[slug]/page.tsx
import { notFound } from 'next/navigation';
import { getArticleDoc } from '@/messages/blog-articles/registry';
export default async function ArticlePage({ params }: { params: { slug: string } }) {
const article = getArticleDoc(params.slug);
// If slug does not exist — return HTTP 404 and render not-found.tsx
if (!article) {
notFound();
}
return <ArticleRenderer article={article} />;
}pages/404.tsx. Next.js сам направляет на него и возвращает HTTP 404. Функция notFound() в Pages Router недоступна — вместо неё используйте { notFound: true } в getStaticProps или getServerSideProps.// Pages Router: pages/blog/[slug].tsx (legacy approach)
export async function getServerSideProps({ params }) {
const article = getArticleDoc(params.slug);
if (!article) {
// Next.js will return HTTP 404 and show pages/404.tsx
return { notFound: true };
}
return { props: { article } };
}Nginx
В Nginx кастомная страница 404 настраивается директивой error_page внутри блока server. Убедитесь, что файл 404.html существует по указанному пути и что его отдача не приводит к внутреннему редиректу на 200.
server {
listen 80;
server_name example.com;
root /var/www/html;
# Custom page for 404 errors
error_page 404 /404.html;
# The location for the file itself — returns 404, not 200
location = /404.html {
internal;
}
# Custom pages for other errors
error_page 500 502 503 504 /50x.html;
location = /50x.html {
internal;
}
}internal запрещает прямой доступ к /404.html снаружи: страница доступна только как ответ на ошибку. Без неё пользователь мог бы открыть /404.html и получить 200, и возник бы дубль контента.Apache / .htaccess
В Apache кастомная 404 настраивается через ErrorDocument — либо в основном конфиге, либо в .htaccess.
# .htaccess in the site root
# Custom 404 page
ErrorDocument 404 /404.html
# You can also point to a PHP file
# ErrorDocument 404 /404.php
# Custom pages for other errors
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
# Enable mod_rewrite for SPA routing
<IfModule mod_rewrite.c>
RewriteEngine On
# For React/Vue SPA: all non-existent routes → index.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.html [L]
</IfModule>index.html с кодом 200, поисковики начнут индексировать несуществующие страницы. Поэтому SPA должна на стороне клиента ставить на страницы 404 мета-тег <meta name="robots" content="[noindex](/glossary/noindex)">, либо нужно использовать SSR/SSG с правильными HTTP-кодами.PHP (WordPress и другие CMS)
В WordPress кастомная 404-страница — это файл 404.php в теме. WordPress автоматически возвращает HTTP 404 для несуществующих URL, если permalink настроены правильно. Если CMS отдаёт 200 вместо 404, проблема обычно в .htaccess или в конфигурации сервера.
<?php
// themes/your-theme/404.php
// WordPress automatically returns HTTP 404
get_header();
?>
<main class="error-404">
<h1>Page Not Found</h1>
<p>Try using search:</p>
<?php get_search_form(); ?>
<p>Or return to the <a href="<?php echo home_url(); ?>">homepage</a>.</p>
</main>
<?php
get_footer();Поиск и исправление битых ссылок
Правильно настроенная 404-страница — лишь половина работы. Вторая половина — найти все ссылки, которые ведут на несуществующие страницы, и исправить их. Битые ссылки — главная причина появления 404 в индексе.
Search Console → Индексирование → Страницы → «Не найдена (404)». Это бесплатный и самый полный источник: Google показывает только те 404, которые обнаружил при сканировании, то есть именно те, что важны для SEO.
Запустите сканирование сайта в Screaming Frog SEO Spider. Фильтр: Response Codes → 4xx. Инструмент покажет не только URL с 404, но и страницы-источники — то есть, откуда именно ведут битые ссылки.
Логи содержат 100% запросов, включая те, которые Google ещё не обнаружил. Фильтр: grep ' 404 ' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20 — топ-20 URL с ответом 404.
Для каждой 404 есть одно из трёх решений: поставить 301 на подходящий URL замены (если есть похожая страница), убрать все внутренние ссылки на этот URL или оставить 404 как есть (если ссылок нет — Google сам уберёт её из индекса).
# Find top-20 broken URLs in Nginx/Apache logs
grep ' 404 ' /var/log/nginx/access.log \
| awk '{print $7}' \
| sort \
| uniq -c \
| sort -rn \
| head -20
# Example output:
# 143 /old-product-page
# 87 /blog/removed-article
# 34 /wp-login.php (attack attempts — not critical)Мониторинг 404-ошибок
Разового аудита мало. Новые 404 появляются постоянно: страницы переименовывают, товары удаляют, внешние сайты ссылаются на несуществующие URL. Важно наладить регулярный мониторинг.
| Инструмент | Что отслеживает | Частота | Бесплатно |
|---|---|---|---|
| Google Search Console | 404, которые Googlebot обнаружил при сканировании | Обновляется ежедневно | Да |
| Screaming Frog + планировщик | Все 404 при полном сканировании сайта | Раз в неделю/месяц | До 500 URL |
| Серверные логи (goaccess, awstats) | Все 404 в реальном времени из access.log | В реальном времени | Да |
| Ahrefs / Semrush Site Audit | 404 и входящие внешние ссылки на 404 | Еженедельно, автоматически | Платно |
| UptimeRobot / Better Uptime | Мониторинг доступности ключевых URL | Каждые 1–5 минут | Базовый бесплатный тариф |
Для больших сайтов (10 000+ страниц) особенно ценны серверные логи: они охватывают 100% запросов, включая ботов, пользователей и скрипты. Search Console показывает только то, что Googlebot нашёл при сканировании, — это часть общей картины.
Чеклист правильной 404-страницы
HTTP-статус
- Страница возвращает HTTP-статус 404 (проверено через curl или DevTools)
- Нет soft 404: страница с сообщением об ошибке не отдаёт 200 OK
- Нет JavaScript-редиректа с несуществующих URL на главную
- Для массово удалённых страниц без замены используется 410 Gone
- 301-редиректы настроены только для URL, у которых есть релевантная страница-замена
Содержимое страницы
- Понятное сообщение об ошибке без технического жаргона
- Есть строка поиска или ссылка на поиск по сайту
- Есть ссылка на главную страницу
- Есть ссылки на 2–4 популярных раздела или категории
- Страница оформлена в фирменном стиле сайта (шапка, подвал, шрифты)
Реализация
- Next.js: создан файл not-found.tsx; для несуществующих slug вызывается notFound()
- Nginx: настроена директива error_page 404; файл 404.html помечен как internal
- Apache: ErrorDocument 404 задан в .htaccess или в основном конфиге
- WordPress: в активной теме есть файл 404.php
- SPA (React/Vue без SSR): на страницах 404 на стороне клиента добавляется мета-тег noindex
Мониторинг
- Google Search Console подключён, email-оповещения настроены
- Регулярное сканирование через Screaming Frog или аналог (минимум раз в месяц)
- Серверные логи доступны и анализируются для сайтов с высоким трафиком
- Все внутренние ссылки на URL с 404 найдены и исправлены
yourdomain.com/test-404-check (несуществующий URL), зайдите в DevTools → Network, найдите первый запрос и посмотрите статус. Если там 200, у вас soft 404, и конфигурацию сервера нужно исправить.FAQ
Ответы на частые вопросы о настройке 404-страниц, которые возникают при аудитах и разработке.
Нужно ли добавлять тег noindex на страницу 404?
Что делать, если страница ранжировалась в Google, а теперь отдаёт 404?
Может ли 404-страница быть красивой и брендированной?
Должна ли 404-страница быть одинаковой для всех несуществующих URL?
Что такое краулинговый бюджет и как на него влияет 404?
Check it with SpiderHead
Free and local: run the audit on your own machine.



