Разработка

Страница 404: как настроить и правильно реализовать

Обложка статьи: страница 404 — как настроить и реализовать

Страница 404 — это первое, что видит пользователь после перехода по битой ссылке. Как вернуть HTTP 404, избежать soft 404, настроить страницу в Next.js, Nginx и Apache — с кодом и чеклистом.

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

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

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

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

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

~74%

Сайтов без кастомной 404

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

≤30 с

Времени на удаление

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
# Проверить HTTP-статус страницы
curl -s -o /dev/null -w "%{http_code}" https://example.com/несуществующий-url
# Ожидаемый вывод: 404

# Проверить заголовки ответа целиком
curl -I https://example.com/несуществующий-url
Быстрая проверка прямо в браузере: откройте DevTools (F12) → вкладка Network → перейдите на 404-страницу → в строке первого запроса смотрите колонку Status. Там должно стоять 404, а не 200.

Soft 404 и 410: чем отличаются

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

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

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

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

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

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

Чёткое сообщение об ошибке

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

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

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

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

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

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

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

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

Чего не нужно делать на 404-странице: автоматически перенаправлять пользователя на главную через JavaScript (window.location.href = '/'). Такой редирект Google может расценить как soft 404 — пользователь ожидал A, получил B, содержимое нерелевантно. Редиректы с 404-URL должны быть 301 на уровне сервера, если есть реальная замена.

Реализация: 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 — Страница не найдена</h1>
      <p>Возможно, ссылка устарела или адрес введён с ошибкой.</p>
      <Link href="/">Вернуться на главную</Link>
    </main>
  );
}

// Next.js автоматически возвращает HTTP 404 для этого файла.

Для программной генерации 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);

  // Если slug не существует — возвращаем HTTP 404 и рендерим 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 (старый подход)
export async function getServerSideProps({ params }) {
  const article = getArticleDoc(params.slug);

  if (!article) {
    // Next.js вернёт HTTP 404 и покажет 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;

    # Кастомная страница для 404 ошибки
    error_page 404 /404.html;

    # Локация для самого файла — возвращаем 404, не 200
    location = /404.html {
        internal;
    }

    # Кастомные страницы для других ошибок
    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 в корне сайта

# Кастомная страница 404
ErrorDocument 404 /404.html

# Если используете PHP — можно указать PHP-файл
# ErrorDocument 404 /404.php

# Кастомные страницы для других ошибок
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html

# Включить mod_rewrite для SPA-роутинга
<IfModule mod_rewrite.c>
    RewriteEngine On
    # Для React/Vue SPA: все несуществующие маршруты → index.html
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ /index.html [L]
</IfModule>
Осторожно с SPA-роутингом в Apache и Nginx: если все 404-маршруты отдавать в index.html с кодом 200, поисковики будут индексировать несуществующие страницы. SPA должно на стороне клиента устанавливать мета-тег <meta name="robots" content="[noindex](/glossary/noindex)"> на страницах 404, либо использовать 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 автоматически возвращает HTTP 404
get_header();
?>
<main class="error-404">
    <h1>Страница не найдена</h1>
    <p>Попробуйте воспользоваться поиском:</p>
    <?php get_search_form(); ?>
    <p>Или вернитесь на <a href="<?php echo home_url(); ?>">главную страницу</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. Инструмент покажет не только сами 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 сам уберёт из индекса).

Пример реализации 404-страницы в коде:
BASH
# Поиск топ-20 битых URL в логах Nginx/Apache
grep ' 404 ' /var/log/nginx/access.log \
  | awk '{print $7}' \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -20

# Пример вывода:
# 143 /old-product-page
#  87 /blog/removed-article
#  34 /wp-login.php  (попытки взлома — не критично)
Не ставьте 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-статус

  • Страница 404 возвращает HTTP-статус 404 (проверено через curl или DevTools)
  • Нет soft 404: страница с сообщением об ошибке не возвращает 200 OK
  • Нет редиректа с несуществующих URL на главную через JavaScript
  • Для массово удалённых страниц без замены используется 410 Gone
  • Редиректы 301 настроены только для URL с релевантной страницей-заменой

Контент страницы

  • Чёткое, понятное сообщение об ошибке без технического жаргона
  • Есть строка поиска или ссылка на поиск по сайту
  • Есть ссылка на главную страницу
  • Есть ссылки на 2–4 популярных раздела или категории
  • Страница оформлена в фирменном стиле сайта (header, footer, шрифты)

Реализация

  • Next.js: файл not-found.tsx создан; notFound() вызывается для несуществующих slug
  • Nginx: директива error_page 404 настроена; файл 404.html помечен как internal
  • Apache: ErrorDocument 404 прописан в .htaccess или основном конфиге
  • WordPress: файл 404.php существует в активной теме
  • SPA (React/Vue без SSR): метатег noindex добавляется на страницы 404

Мониторинг

  • Google Search Console подключён и настроены email-алерты
  • Регулярный краулинг через Screaming Frog или аналог (раз в месяц минимум)
  • Серверные логи доступны и анализируются для сайтов с высоким трафиком
  • Все внутренние ссылки, ведущие на 404, найдены и исправлены
Проверьте свою 404-страницу прямо сейчас: перейдите на yourdomain.com/test-404-check (несуществующий URL), откройте DevTools → Network, найдите первый запрос, посмотрите статус. Если там 200 — у вас soft 404 и нужно исправить конфигурацию сервера.

FAQ

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

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