Если нужно закрыть от индексации не только обычные страницы, но и PDF, архивы, служебные URL или файлы, X-Robots-Tag часто удобнее, чем править шаблоны и надеяться на мета-теги в теме. Этот заголовок отдает поисковику директивы на уровне ответа сервера, поэтому работает и для документов, и для нестандартных маршрутов.
На практике задача обычно выглядит так: у сайта есть файл с инструкцией, старый PDF, архивы автора или страницы с параметрами, которые не должны попадать в индекс. В HTML-шаблоне это не всегда удобно решать через meta robots, а иногда и невозможно. Тогда проще добавить заголовок только для нужных URL.
Когда X-Robots-Tag действительно нужен
Этот способ полезен, если вы хотите управлять индексацией на уровне ответа, а не в разметке. Он подходит для:
- PDF, DOCX и других файлов из медиабиблиотеки;
- служебных страниц, которые отдаются не через обычный шаблон;
- архивов, которые нужно закрыть точечно;
- URL с параметрами, если они генерируются кодом или плагином;
- сценариев, где
meta robotsне срабатывает из-за кеша или нестандартной темы.
Если у вас обычная запись или страница, сначала проверьте, нельзя ли решить задачу через настройки SEO-плагина. Для типовых страниц это проще и безопаснее. X-Robots-Tag нужен там, где разметка не контролируется или контролируется частично.
Диагностика проблемы: что именно попадает в индекс
Перед правкой нужно понять, какой URL вы закрываете и как он сейчас отвечает. Ошибка здесь типовая: закрывают не тот адрес, а потом удивляются, что дубль остался в индексе.
Проверьте ответ сервера
Самый быстрый способ — посмотреть заголовки ответа:
curl -I https://example.com/wp-content/uploads/2024/10/manual.pdfВ ответе ищите строку вида:
X-Robots-Tag: noindex, nofollowЕсли заголовка нет, значит правило не добавлено или не сработало на этом типе URL. Если заголовок есть, но страница все равно индексируется, проверьте, не осталась ли старая версия в кеше и не закрывает ли URL другой заголовок или мета-тег.
Проверьте, не конфликтует ли SEO-плагин
Некоторые плагины уже добавляют meta robots на уровне HTML. Это не ошибка, но важно понимать приоритеты: если в HTML стоит index, а в заголовке noindex, поисковик обычно учитывает оба сигнала, но лучше не создавать противоречий. Для служебных URL оставляйте один понятный источник директивы.
Пошаговая настройка через functions.php или мини-плагин
Если нужен контроль без правок сервера, можно добавить заголовок через WordPress. Это удобно для отдельных шаблонов, архивов и файлов, которые отдаются через PHP.
Ниже пример, который закрывает архивы автора, архивы дат и страницы поиска. Такой код лучше держать в мини-плагине или в дочерней теме, а не в основной теме, чтобы не потерять настройку при обновлении.
<?php
add_action('template_redirect', function () {
if (is_author() || is_date() || is_search()) {
if (!headers_sent()) {
header('X-Robots-Tag: noindex, nofollow', true);
}
}
});Что здесь важно:
template_redirectсрабатывает до вывода шаблона, когда заголовки еще можно отправить;headers_sent()защищает от предупреждений, если тема уже что-то вывела;- директива применяется только к нужным типам страниц.
Если нужно закрыть только поиск, а архивы оставить открытыми, уберите лишние условия. Чем точнее правило, тем меньше риск случайно закрыть полезные страницы.
Закрытие PDF и других файлов из uploads
Для файлов из медиабиблиотеки WordPress через PHP это не всегда удобно, потому что они часто отдаются напрямую веб-сервером. В таком случае надежнее настроить заголовок на уровне Apache или Nginx.
Для Apache можно использовать .htaccess:
<IfModule mod_headers.c>
<FilesMatch "\.(pdf|docx|xlsx)$">
Header set X-Robots-Tag "noindex, nofollow"
</FilesMatch>
</IfModule>Для Nginx логика обычно задается в конфигурации сервера, например через location или add_header. Конкретный блок зависит от вашей схемы раздачи файлов, поэтому лучше тестировать на staging, а не вносить изменения вслепую на боевом сайте.
Сравнение подходов: плагин, код, сервер
| Подход | Когда использовать | Плюсы | Компромисс |
|---|---|---|---|
| SEO-плагин | Обычные записи, страницы, архивы | Просто, без кода | Не всегда подходит для файлов и нестандартных URL |
| PHP-код в WordPress | Архивы, поиск, служебные шаблоны | Гибко, можно точечно | Не сработает для файлов, отдаваемых сервером напрямую |
| .htaccess / Nginx | PDF, документы, статические файлы | Работает на уровне ответа | Нужен доступ к серверной конфигурации |
Если задача касается именно файлов, не пытайтесь решить ее только через WordPress-хуки. Для PDF и похожих ресурсов это часто лишний слой, который не влияет на реальный ответ сервера.
Проверка результата после внедрения
После настройки нужно проверить не только наличие заголовка, но и то, как URL отдается поисковику и кешу.
- Откройте URL через
curl -Iи убедитесь, чтоX-Robots-Tagприсутствует. - Проверьте страницу в браузере в режиме инкогнито и через инструменты разработчика, вкладка Network.
- Если используется кеш-плагин или серверный кеш, очистите его и повторите запрос.
- Для файлов из
/uploads/проверьте именно прямой URL файла, а не страницу вложения.
Если URL уже был в индексе, удаление не произойдет мгновенно. Сначала поисковик должен заново обойти страницу и увидеть новый сигнал. Поэтому после внедрения полезно отправить URL на переобход в инструментах для вебмастеров и посмотреть, как меняется статус.
Частые ошибки и как их исправить
Заголовок добавили слишком поздно
Если код выполняется после вывода контента, PHP уже не может отправить заголовок. Симптом — предупреждение о том, что заголовки уже отправлены, или отсутствие X-Robots-Tag в ответе. Решение: переносите код в более ранний хук, например template_redirect, или настраивайте заголовок на уровне сервера.
Закрыли не тот тип URL
Часто путают архивы авторов, архивы дат и страницы поиска. У них разные условия в WordPress. Если нужно закрыть только один тип, не используйте слишком широкую проверку. Например, is_archive() закроет больше, чем вы ожидаете.
Кеш отдает старую версию
После изменения заголовков кеш может продолжать отдавать старый ответ без X-Robots-Tag. Это особенно заметно на CDN и page cache. В таком случае нужно очистить все уровни кеширования и повторно проверить ответ сервера напрямую.
Конфликт с meta robots
Если SEO-плагин или тема уже выводят noindex в HTML, а вы добавляете другой набор директив в заголовке, можно получить путаницу при отладке. Лучше оставить один источник истины для конкретного URL и документировать, где именно задается правило.
Чек-лист перед публикацией изменений
- Проверен точный URL, который нужно закрыть.
- Понятно, где отдается ресурс: WordPress, Apache или Nginx.
- Добавлен только нужный тип директивы, без лишних условий.
- Кеш очищен на всех уровнях.
- Заголовок подтвержден через
curl -Iили DevTools. - Нет противоречия между
X-Robots-Tagиmeta robots.
Безопасность и производительность
Не кладите такие правила в произвольный файл темы, если проект живет долго и обновляется. Для кода лучше использовать мини-плагин или дочернюю тему, чтобы не потерять настройку при деплое. Если правило касается большого количества файлов, серверная конфигурация обычно надежнее и дешевле по ресурсам, чем проверка на каждом запросе через PHP.
Если у вас уже есть сложная система SEO-настроек, иногда проще использовать один аккуратный инструмент для технической оптимизации, чем собирать логику из нескольких плагинов и фрагментов кода. Но даже в этом случае проверяйте итоговый HTTP-ответ, а не только галочку в админке.