Если в WordPress появляются технические страницы, PDF-файлы, выгрузки или URL с параметрами вроде ?utm_source=, одного noindex в HTML часто недостаточно. Для таких случаев удобнее использовать заголовок X-Robots-Tag: он работает на уровне ответа сервера и подходит для файлов, архивов и отдельных шаблонов, где в разметку метатег просто не попадёт.
Ниже — рабочая схема: как понять, где именно у вас индексируются лишние URL, как настроить заголовок через код или сервер, и как проверить, что поисковик действительно видит нужный запрет.
Когда X-Robots-Tag нужен, а когда нет
Этот заголовок полезен в трёх типичных сценариях:
- нужно закрыть от индексации PDF, CSV, ZIP и другие файлы, которые отдаются не через шаблон WordPress;
- нужно запретить индексацию страниц с параметрами, но оставить саму страницу доступной для пользователя;
- нужно управлять индексацией на уровне ответа, а не в контенте, например для выгрузок или служебных маршрутов.
Если речь идёт о обычной записи или странице, чаще достаточно noindex в SEO-плагине или через wp_robots. Но когда URL создаётся вне шаблона, заголовок надёжнее.
Диагностика проблемы: что именно попадает в индекс
Сначала не трогайте код. Проверьте, какие URL реально индексируются и почему.
Что смотреть в первую очередь
- отчёт «Страницы» в Google Search Console;
- серверные логи или статистику обхода, если есть доступ;
- ответ URL через
curl -Iили DevTools; - наличие дубликатов с параметрами
?replytocom=,?amp,?utm_*,?filter=.
Пример проверки заголовков:
curl -I https://example.com/file.pdfВ ответе должен появиться заголовок вроде:
X-Robots-Tag: noindex, nofollowЕсли его нет, поисковик может продолжать обходить и индексировать файл или страницу, особенно если на неё есть внутренние ссылки.
Какой способ выбрать: плагин, код или сервер
Для WordPress есть три нормальных пути. Выбор зависит от того, где именно формируется ответ.
| Подход | Когда использовать | Минусы |
|---|---|---|
| SEO-плагин | Обычные записи, страницы, архивы | Не всегда работает для файлов и нестандартных ответов |
| Код в теме или мини-плагине | Нужно точечно добавить заголовок для URL по условию | Требует аккуратной проверки и поддержки |
| Настройка сервера | PDF, медиафайлы, служебные каталоги, nginx/apache | Нужно иметь доступ к конфигу и понимать правила |
Если у вас обычный сайт на WordPress, я бы начинал с кода в мини-плагине: так проще контролировать логику и не зависеть от темы.
Пошаговое решение через WordPress
Ниже пример, который добавляет X-Robots-Tag: noindex, nofollow для URL с GET-параметрами и для PDF-файлов, если они отдаются через WordPress.
<?php
/**
* Plugin Name: WP Mentor Robots Headers
*/
add_action('send_headers', function () {
if (is_admin() || wp_doing_ajax() || wp_is_json_request()) {
return;
}
$request_uri = isset($_SERVER['REQUEST_URI']) ? wp_unslash($_SERVER['REQUEST_URI']) : '';
// Закрываем страницы с параметрами.
if (strpos($request_uri, '?') !== false) {
header('X-Robots-Tag: noindex, nofollow', true);
return;
}
// Закрываем PDF, если файл отдается через WordPress.
if (is_singular() && preg_match('~\.pdf$~i', $request_uri)) {
header('X-Robots-Tag: noindex, nofollow', true);
}
});Это базовый вариант. На реальном сайте его лучше сузить, чтобы не закрыть лишнее. Например, если у вас есть страницы с параметрами, которые должны индексироваться, добавьте белый список.
<?php
add_action('send_headers', function () {
if (is_admin() || wp_doing_ajax() || wp_is_json_request()) {
return;
}
$request_uri = isset($_SERVER['REQUEST_URI']) ? wp_unslash($_SERVER['REQUEST_URI']) : '';
// Разрешаем конкретные параметры.
$allowed = array('s', 'paged');
$query_string = wp_parse_url($request_uri, PHP_URL_QUERY);
if ($query_string) {
parse_str($query_string, $params);
$keys = array_keys($params);
$diff = array_diff($keys, $allowed);
if (!empty($diff)) {
header('X-Robots-Tag: noindex, nofollow', true);
}
}
});Если задача касается только медиафайлов, иногда проще настроить сервер. Для Apache это может выглядеть так:
<IfModule mod_headers.c>
<FilesMatch "\.(pdf|doc|docx|xls|xlsx)$">
Header set X-Robots-Tag "noindex, nofollow"
</FilesMatch>
</IfModule>Для nginx логика обычно задаётся через location или add_header, но там важно не сломать уже существующие заголовки и не дублировать правила в нескольких местах конфигурации.
Проверка результата после внедрения
После правки не ограничивайтесь визуальной проверкой. Нужны минимум три шага:
- проверьте заголовок через
curl -Iили DevTools; - откройте URL в браузере и убедитесь, что страница доступна пользователю;
- посмотрите исходный ответ и убедитесь, что нет конфликтующего
meta robotsс противоположной директивой.
Команда для проверки:
curl -I "https://example.com/page/?utm_source=test"Если всё сделано правильно, в ответе будет X-Robots-Tag, а в HTML при этом может не быть никакого метатега — это нормально.
Дальше проверьте Search Console. Если URL уже был в индексе, удаление не происходит мгновенно: поисковику нужно переобойти страницу и увидеть новый ответ сервера.
Частые ошибки и как их исправить
Заголовок добавили, но индекс не меняется
Чаще всего причина в том, что URL давно в индексе, а робот ещё не успел переобойти страницу. Проверьте, что заголовок реально отдаётся сейчас, и дождитесь повторного обхода. Если страница важная, можно отправить её на переобход вручную.
Закрыли не только параметры, но и нужные страницы
Это бывает, когда правило слишком широкое и срабатывает на любой URL с ?. Решение — сузить условие: проверять конкретные параметры, конкретные шаблоны или конкретные типы файлов.
Конфликт между noindex в HTML и заголовком
Если SEO-плагин ставит одно, а код — другое, поисковик получает смешанный сигнал. В таких случаях оставьте один источник правды. Для обычных страниц — либо SEO-плагин, либо wp_robots. Для файлов — только X-Robots-Tag.
Заголовок не виден из-за кеша
Если на сайте стоит серверный кеш или CDN, старый ответ может продолжать отдаваться из кеша. После изменения правил очистите кеш на всех уровнях: плагин, сервер, CDN.
Чек-лист перед публикацией изменений
- Проверен точный список URL, которые нужно закрыть.
- Понятно, где формируется ответ: WordPress, сервер или CDN.
- Нет конфликта с SEO-плагином.
- Заголовок проверен через
curl -I. - Кеш очищен после изменений.
- В Search Console отслеживается повторный обход.
Практические советы по безопасности и производительности
Не делайте универсальное правило на весь сайт без исключений. На больших проектах это быстро превращается в проблему поддержки: одна правка ломает индексацию целого раздела. Лучше хранить логику в мини-плагине и документировать, какие URL закрываются и почему.
Если у вас много технических страниц, имеет смысл дополнительно проверить дубли в sitemap и внутренние ссылки. Иногда X-Robots-Tag решает только часть задачи, а остальное продолжает подталкивать поисковик к обходу лишних URL.
Для сайтов, где регулярно появляются служебные выгрузки и PDF, удобно держать отдельный список расширений и шаблонов, которые должны получать noindex. Это проще сопровождать, чем вручную править десятки страниц.