Как отдавать 410 Gone для удалённых страниц в WordPress вместо 404

Если в WordPress регулярно удаляются записи, страницы, товары или старые URL после миграции, обычный ответ 404 Not Found не всегда лучший вариант. Для адресов, которые удалены окончательно и не вернутся, корректнее отдавать 410 Gone. Для поисковиков это прямой сигнал: страница удалена намеренно, проверять её дальше не нужно.

Это не про «ускорить SEO» магией. Смысл практический: уменьшить количество бесполезных повторных обходов, убрать мусорные URL из индекса и сделать поведение сайта предсказуемым. Но применять 410 нужно точечно. Если страница переехала на новый адрес, нужен редирект 301. Если контент временно недоступен, 410 тоже не подходит.

Когда 410 действительно нужен

Сценарий простой: URL больше не существует, и вы не планируете его восстанавливать. Например, удалённая новость, устаревшая посадочная, закрытая акция, страница тестового импорта, которая попала в индекс, или набор старых URL после чистки структуры сайта. В таких случаях 410 лучше, чем 404, потому что он явно сообщает о намеренном удалении.

Когда 410 не ставят

Не путайте удаление с переездом. Если у страницы есть новая версия, используйте 301. Если вы ещё не решили судьбу адреса, оставьте 404. Если URL должен открываться только для авторизованных пользователей, это уже история про 401/403, а не 410.

Диагностика проблемы: как понять, что на сайте накопились лишние URL

Обычно проблема видна в трёх местах: отчёты поисковых систем, логи сервера и внутренний поиск по сайту. В Search Console можно увидеть много запросов к несуществующим страницам. В логах — повторяющиеся обращения к старым URL, которые уже давно удалены. Если на сайте была миграция, часто всплывают адреса со старой структуры, которые продолжают обходиться роботами.

Проверьте, какие именно URL отдают 404. Если это страницы, которые вы удалили осознанно и не хотите возвращать, их можно перевести на 410. Если же среди них есть адреса с внешними ссылками или трафиком, сначала оцените, не нужен ли редирект на релевантную страницу.

  • URL удалён окончательно и не имеет замены — кандидат на 410.
  • URL переехал на новый адрес — нужен 301.
  • URL был ошибочно удалён — лучше восстановить контент.
  • URL генерируется плагином или темой — сначала ищите источник генерации.

Как отдать 410 Gone через код

Самый надёжный способ — точечно обработать нужные URL в template_redirect и отправить заголовок 410 Gone. Это удобно, если список адресов небольшой и известен заранее. Ниже пример для нескольких конкретных путей.

<?php
add_action('template_redirect', function () {
    $path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');

    $gone_paths = array(
        'old-page',
        'archive/test-landing',
        'promo/spring-2023',
    );

    if (in_array($path, $gone_paths, true)) {
        status_header(410);
        nocache_headers();
        include get_query_template('404');
        exit;
    }
});

Здесь важный момент: мы не просто меняем код ответа, а ещё подключаем шаблон 404, чтобы пользователь увидел нормальную страницу ошибки. Для поисковика решающим будет именно заголовок 410.

Если список URL большой

Когда удалённых адресов много, удобнее хранить их в массиве или в отдельном файле конфигурации. Но не стоит превращать это в бездумный список всех 404. 410 имеет смысл только для окончательно удалённых страниц. Для массовой обработки лучше сначала выгрузить список из логов или Search Console, отфильтровать важные URL и только потом добавлять их в код.

<?php
add_action('template_redirect', function () {
    $request_uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');

    $gone_rules = array(
        'catalog/old-product-1' => true,
        'catalog/old-product-2' => true,
        'news/2019/obsolete-post' => true,
    );

    if (!empty($gone_rules[$request_uri])) {
        status_header(410);
        nocache_headers();
        wp_die(
            'Страница удалена.',
            '410 Gone',
            array('response' => 410)
        );
    }
});

В этом варианте используется wp_die() с кодом ответа 410. Для небольших проектов это даже проще, чем подключать отдельный шаблон. Но если у вас уже есть кастомная 404-страница, лучше сохранить единый дизайн и использовать её.

Как сделать 410 через плагин или правила сервера

Если не хочется править тему, можно использовать плагин для редиректов, если он умеет отдавать 410 для конкретных URL. Это удобно для редакторов и контент-менеджеров, но важно проверить, как плагин обрабатывает кэш и не превращает 410 в редирект на страницу-заглушку.

ПодходПлюсыМинусы
Код в теме или mu-pluginТочный контроль, без лишних зависимостейНужно аккуратно поддерживать список URL
Плагин редиректовУдобно для редакторов, не нужен PHPЗависимость от плагина, возможны ограничения по 410
Правила сервераБыстро и без нагрузки на WordPressСложнее сопровождать, нужен доступ к конфигу сервера

Если у вас много старых URL после миграции, серверный вариант может быть самым лёгким для сайта. Но для большинства задач WordPress достаточно кода в mu-plugin или в отдельном небольшом плагине.

Проверка результата после внедрения

После настройки не ограничивайтесь открытием страницы в браузере. Браузер может показать красивую заглушку, но вам нужен именно HTTP-статус.

  1. Проверьте ответ через curl -I https://example.com/old-page.
  2. Убедитесь, что в заголовках есть HTTP/1.1 410 Gone или аналогичный статус.
  3. Откройте URL в режиме инкогнито и проверьте, что страница не редиректит на главную.
  4. Посмотрите, не кэширует ли CDN или плагин кэширования старый ответ.
  5. Через несколько дней проверьте отчёты поисковой системы и логи сервера.

Пример проверки через консоль:

curl -I https://example.com/promo/spring-2023

Если вместо 410 вы видите 200, значит правило не сработало. Если видите 301 или 302, где-то есть редирект, который перебивает ваш код. Если ответ 404, значит условие не совпало с реальным путём или код выполняется слишком поздно.

Частые ошибки и как их исправить

Самая частая ошибка — ставить 410 на всё подряд. Так можно случайно удалить из обхода страницы, которые нужно было перенаправить. Вторая ошибка — отдавать 410 только визуально, без правильного HTTP-статуса. Поисковик ориентируется на заголовок, а не на текст на странице.

Ещё одна типичная проблема — конфликт с кэшем. Если CDN или плагин кэширования уже сохранил 200-ответ, пользователи и роботы продолжат видеть старую версию. После изменения правил нужно очистить кэш на всех уровнях: WordPress, сервер, CDN, браузерные тесты.

  • Ошибка: поставили 410 на URL с внешними ссылками. Исправление: оцените трафик и замените на 301, если есть релевантная страница.
  • Ошибка: правило срабатывает только на части адресов. Исправление: проверьте слэши, регистр и точный путь из REQUEST_URI.
  • Ошибка: страница выглядит как 404, но статус 200. Исправление: используйте status_header(410) или wp_die(..., array('response' => 410)).
  • Ошибка: 410 отдаётся для страниц, которые генерирует плагин. Исправление: найдите источник URL и отключите генерацию на уровне плагина.

Безопасность и производительность: что учесть

Для небольшого числа URL код в template_redirect почти не влияет на производительность. Но если список большой, не стоит делать тяжёлые запросы к базе на каждом хите. Лучше хранить правила в простом массиве, в опции с автозагрузкой по необходимости или в отдельном файле, который подключается без лишней логики.

С точки зрения безопасности не давайте пользователям из админки произвольно вставлять PHP-код для 410-правил. Если нужен интерфейс, делайте его через настройки плагина или через список URL в базе с жёсткой валидацией. И отдельно следите, чтобы правило не открывало путь к произвольным заголовкам или редиректам.

Что делать после массовой чистки URL

Если вы удалили большой блок контента, не ограничивайтесь 410. Проверьте внутренние ссылки, меню, XML-карту сайта и старые блоки в контенте. Иначе сайт продолжит ссылаться на удалённые адреса, а пользователи будут попадать в тупик. В таких случаях полезно сначала найти все упоминания старых URL, а уже потом решать, где нужен 301, где 410, а где восстановление страницы.

Практически это выглядит так: сначала собираете список удалённых адресов, затем делите его на группы, после чего для каждой группы выбираете действие. Такой подход лучше, чем массово превращать все ошибки в один тип ответа. Для поисковой оптимизации и поддержки сайта это обычно даёт более чистую картину, чем хаотичная смесь 404, 302 и случайных редиректов.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как настроить автоматический мониторинг здоровья WordPress с помощью WPCheck
13.09.2026
Диагностика и решение проблем с отправкой email в WooCommerce
13.09.2026
Как решить проблему отключения плагинов в WordPress при использовании константы DISABLE_WP_CRON
02.10.2026
Диагностика и решение проблем с не отправляющимися email в WooCommerce
02.10.2026
Как закрыть от индексации строки и файлы в WordPress через robots.txt и мета-теги
10.09.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше