Кастомная 404-страница: как настроить и реализовать правильно

Как вернуть настоящий 404, не подавать сигналов soft 404 и дать посетителям полезный путь назад во фреймворках и в конфигурации сервера.

Когда пользователь переходит по битой ссылке, сервер должен вернуть статус 404 Not Found. Но в реальных проектах это правило нарушают на удивление часто: CMS отдаёт 200 OK, редирект ведёт на главную или страница «404» технически возвращает правильный код, но выглядит как пустой экран. Каждая из этих ситуаций — отдельная проблема и для SEO, и для пользователя.

Правильно настроенная 404-страница решает сразу три задачи: сообщает Google, что URL не существует; удерживает пользователя на сайте и помогает найти нужный раздел; защищает краулинговый бюджет от впустую потраченных проходов. Разберём каждый аспект по порядку.

Google не наказывает сайты за страницы 404. Проблемы возникают не из-за самого кода 404, а из-за неправильной реализации: когда 404 отдаёт 200 OK, когда на такие URL ведут внутренние ссылки или когда тысячи страниц удалены без 301-редиректов.

Что такое 404-страница

404 Not Found — HTTP-код ответа, который сервер возвращает, когда запрошенный ресурс не существует. Код означает, что сервер работает нормально и маршрут найден, но запрошенного документа нет. Так 404 отличается от 500 (ошибка сервера) и 503 (сервис недоступен).

~74%

Сайтов без своей 404

Большинство сайтов показывают стандартную 404 платформы вместо брендированной страницы с навигацией

Недели

Время до исключения из индекса

Google обычно удаляет корректную 404 из индекса за несколько недель. Ускорить можно через Search Console

Soft 404

Самая частая ошибка

CMS отдаёт 200 OK вместо 404 — Google индексирует пустые страницы и размывает тематику сайта

410

Удаляется быстрее

Google удаляет 410 (Gone) из индекса заметно быстрее, чем 404 — используйте его при массовом удалении страниц

404-страница существует на двух уровнях. HTTP-уровень — это код ответа в заголовке, который видит поисковый робот. Визуальный уровень — это HTML-контент, который видит пользователь. Оба уровня одинаково важны: неверный HTTP-код — проблема для SEO, слабый дизайн — проблема для UX.

Главное правило: всегда возвращать HTTP 404

Первое и самое важное правило: страница с ошибкой должна возвращать HTTP-статус 404 (или 410), но никогда не 200. Это называют «жёсткой 404» (hard 404) в отличие от «мягкой 404» (soft 404).

Критическая ошибка — отдавать HTML с текстом «Страница не найдена» под HTTP-статусом 200 OK. Google видит «успешный» ответ и ставит страницу в очередь на индексацию. В итоге в индексе появляются сотни бессмысленных URL с одинаковым содержимым.

Проверить HTTP-статус любой страницы можно прямо в браузере: F12 → Network → перезагрузить страницу → первый запрос → колонка Status. Или через curl в терминале:

bash
# 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-url
Быстрая проверка в браузере: откройте DevTools (F12) → вкладка Network → перейдите на страницу 404 → в колонке Status первого запроса должно стоять 404, а не 200.

Soft 404 и 410: в чём разница

Помимо «жёсткой 404» есть два смежных случая, которые на практике часто путают: soft 404 и статус 410. Разница между ними важна для правильной работы с удалёнными страницами.

СтатусHTTP-кодЧто это значит для GoogleКогда использовать
Жёсткая 404 (hard 404)404Ресурс не найден; Google удалит из индекса за несколько недельСтраница удалена или никогда не существовала
Мягкая 404 (soft 404)200 (ошибка!)Google видит «успешный» ответ и индексирует пустой контентНикогда — это ошибка реализации, а не осознанный выбор
Gone410Ресурс удалён навсегда; Google исключает его из индекса заметно быстрее, чем 404Массовое удаление страниц (старые товары, устаревшие разделы)
Soft 404 — не осознанное решение разработчика, а баг. Чаще всего он возникает в WordPress и других CMS, где шаблон 404 встроен в основной layout, который всегда отдаёт 200. Проверьте свою 404-страницу прямо сейчас через curl или DevTools.

Google также относит к soft 404 редиректы с URL 404 на главную страницу или на другую нерелевантную страницу. Для поисковика это выглядит так: пользователь искал A, попал на B, а содержимое B не отвечает на запрос. Так снижается сигнал качества страницы-цели.

Что должна содержать хорошая 404-страница

Пользователь, попавший на 404, уже немного раздражён. Задача страницы — снять это раздражение и дать понятный следующий шаг. У эффективной 404-страницы узнаваемая структура.

Как кастомная 404-страница удерживает пользователя на сайте.

Понятное сообщение об ошибке

Объясните ситуацию простым языком: «Страница не найдена» или «Такой страницы, похоже, не существует». Не используйте технический жаргон и коды ошибок в видимом тексте.

Строка поиска

Самый эффективный элемент 404-страницы. Пользователь уже знает, что ищет, — дайте ему найти нужное прямо здесь, без возврата в Google.

Навигация по ключевым разделам

Ссылки на главную, популярные разделы или карту сайта помогают сориентироваться и продолжить путь по сайту.

Кнопка «Назад»

Многие пользователи хотят вернуться туда, откуда пришли. Ссылка или кнопка «Назад» снижает показатель отказов и улучшает UX.

Самое рабочее решение для e-commerce: показывать на 404-странице популярные товары или категории. Пользователь, пришедший по битой ссылке на конкретный товар, с высокой вероятностью интересуется именно этой категорией.

Чего не делать на 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]/.

tsx
// 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.

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 Router (Next.js <13) кастомная 404-страница устроена иначе: создаётся файл pages/404.tsx. Next.js сам направляет на него и возвращает HTTP 404. Функция notFound() в Pages Router недоступна — вместо неё используйте { notFound: true } в getStaticProps или getServerSideProps.
tsx
// 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.

nginx
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.

apache
# .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>
Осторожно с SPA-роутингом в Apache и Nginx: если отдавать все 404-маршруты как 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
<?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 в индексе.

Шаг 1Найти через Google Search Console

Search Console → Индексирование → Страницы → «Не найдена (404)». Это бесплатный и самый полный источник: Google показывает только те 404, которые обнаружил при сканировании, то есть именно те, что важны для SEO.

Шаг 2Просканировать сайт в Screaming Frog

Запустите сканирование сайта в Screaming Frog SEO Spider. Фильтр: Response Codes → 4xx. Инструмент покажет не только URL с 404, но и страницы-источники — то есть, откуда именно ведут битые ссылки.

Шаг 3Проверить серверные логи

Логи содержат 100% запросов, включая те, которые Google ещё не обнаружил. Фильтр: grep ' 404 ' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20 — топ-20 URL с ответом 404.

Шаг 4Исправить или настроить редиректы

Для каждой 404 есть одно из трёх решений: поставить 301 на подходящий URL замены (если есть похожая страница), убрать все внутренние ссылки на этот URL или оставить 404 как есть (если ссылок нет — Google сам уберёт её из индекса).

Пример кода для поиска битых URL:
bash
# 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)
Не ставьте 301 с каждого 404-URL на главную: такой приём называют «redirect chain to homepage», и Google расценивает его как soft 404. Редирект оправдан, только если целевая страница тематически близка к удалённой. Если замены нет, правильный ответ — 404.

Мониторинг 404-ошибок

Разового аудита мало. Новые 404 появляются постоянно: страницы переименовывают, товары удаляют, внешние сайты ссылаются на несуществующие URL. Важно наладить регулярный мониторинг.

ИнструментЧто отслеживаетЧастотаБесплатно
Google Search Console404, которые Googlebot обнаружил при сканированииОбновляется ежедневноДа
Screaming Frog + планировщикВсе 404 при полном сканировании сайтаРаз в неделю/месяцДо 500 URL
Серверные логи (goaccess, awstats)Все 404 в реальном времени из access.logВ реальном времениДа
Ahrefs / Semrush Site Audit404 и входящие внешние ссылки на 404Еженедельно, автоматическиПлатно
UptimeRobot / Better UptimeМониторинг доступности ключевых URLКаждые 1–5 минутБазовый бесплатный тариф

Для больших сайтов (10 000+ страниц) особенно ценны серверные логи: они охватывают 100% запросов, включая ботов, пользователей и скрипты. Search Console показывает только то, что Googlebot нашёл при сканировании, — это часть общей картины.

Настройте оповещения в Google Search Console: Настройки → Email-уведомления. GSC отправит письмо, если число 404 резко вырастет, например после деплоя, который сломал маршрутизацию.

Чеклист правильной 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 найдены и исправлены
Проверьте свою 404-страницу прямо сейчас: откройте yourdomain.com/test-404-check (несуществующий URL), зайдите в DevTools → Network, найдите первый запрос и посмотрите статус. Если там 200, у вас soft 404, и конфигурацию сервера нужно исправить.

FAQ

Ответы на частые вопросы о настройке 404-страниц, которые возникают при аудитах и разработке.

Нужно ли добавлять тег noindex на страницу 404?
Нет. Страница с HTTP-статусом 404 не попадёт в индекс Google, независимо от наличия noindex: Google просто не добавит её в индекс. Если вернуть 200 OK с noindex, Google может временно считать страницу индексируемой, а потом передумать. Правильный HTTP-код важнее любых мета-тегов.
Что делать, если страница ранжировалась в Google, а теперь отдаёт 404?
Google удалит её из индекса сам — обычно через 1–4 недели после того, как Googlebot снова обойдёт URL. Чтобы ускорить удаление, используйте инструмент «Удаление URL» в Search Console. Если есть близкая по теме страница-замена, настройте 301-редирект: он передаёт ссылочный вес и быстрее обновляет позиции.
Может ли 404-страница быть красивой и брендированной?
Должна. Брендированная 404 с навигацией удерживает пользователя на сайте и снижает показатель отказов. HTTP-статус 404 в заголовке не мешает сделать страницу привлекательной. Главное — вернуть правильный HTTP-код и дать пользователю понятный следующий шаг.
Должна ли 404-страница быть одинаковой для всех несуществующих URL?
Для большинства сайтов подходит одна универсальная 404-страница. В e-commerce можно сделать персонализацию: определять по шаблону URL, из какой категории пришёл пользователь, и показывать релевантные товары. Но такое усложнение оправдано, только если страницы 404 получают заметный трафик.
Что такое краулинговый бюджет и как на него влияет 404?
Краулинговый бюджет — число страниц, которые Googlebot готов обойти на вашем сайте за определённый период. Если на сайте есть внутренние ссылки на URL с 404, бот снова и снова заходит на эти мёртвые адреса вместо живых страниц. Для сайтов с миллионами URL это критично: уберите все внутренние ссылки на 404.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it