PDF в /wp-content/uploads/ часто попадают в индекс Google и Яндекса: прямая ссылка, sitemap, внешний бэклинк – и документ в выдаче. Если это прайс для клиентов, закрытый гайд или просто ненужный в поиске файл, индексацию можно ограничить заголовком X-Robots-Tag, правилами веб-сервера или через SEO-плагин. Ниже – рабочие варианты для WordPress на Nginx и Apache.
Когда это нужно
- материалы для подписчиков или платного доступа, которые лежат по прямой URL;
- служебные и внутренние PDF (инструкции, акты), которые не должны светиться в поиске;
- дубли контента: PDF повторяет HTML-страницу и размывает выдачу.
Важно: noindex не делает файл секретным. Кто знает URL, скачает. Для персональных данных и настоящей конфиденциальности нужны auth, подпись URL, отдельное хранилище вне web-root, а не только robots-заголовок.
Способ 1: X-Robots-Tag на Nginx
Выделите каталог под «не для индекса» (например /wp-content/uploads/private-files/) и отдайте заголовок для всего location:
location /wp-content/uploads/private-files/ {
add_header X-Robots-Tag "noindex, nofollow" always;
}
Либо для всех PDF в uploads:
location ~* ^/wp-content/uploads/.*\.pdf$ {
add_header X-Robots-Tag "noindex, nofollow" always;
}
Проверка конфига и reload (на WordOps / стандартном nginx):
sudo nginx -t && sudo systemctl reload nginx
Флаг always полезен, чтобы заголовок уходил и на не-200 ответах. Если PDF раздаёт PHP или плагин, а не nginx напрямую, заголовок нужно ставить там, где формируется ответ.
Способ 2: Apache (.htaccess / Directory)
Нужен модуль headers. В .htaccess внутри каталога или в конфиге vhost:
<IfModule mod_headers.c>
<FilesMatch "\.pdf$">
Header set X-Robots-Tag "noindex, nofollow"
</FilesMatch>
</IfModule>
Вариант через Directory (путь подставьте свой):
<Directory "/var/www/example/htdocs/wp-content/uploads/private-files/">
Header set X-Robots-Tag "noindex, nofollow"
</Directory>
Способ 3: заголовок из WordPress (functions.php / mini-plugin)
Если статика отдаётся PHP (редко для PDF) или вы перехватываете запрос через rewrite, можно повесить заголовок на URI:
add_action('template_redirect', function () {
$protected = '/wp-content/uploads/private-files/';
$uri = $_SERVER['REQUEST_URI'] ?? '';
if (strpos($uri, $protected) === 0) {
header('X-Robots-Tag: noindex, nofollow');
}
});
Для обычных PDF, которые nginx/Apache отдаёт как файлы в обход PHP, этот хук не сработает. Тогда только конфиг веб-сервера или плагин, который реально участвует в отдаче файла.
Способ 4: SEO-плагины
Плагины вроде The SEO Framework, Yoast, Rank Math в первую очередь управляют HTML-страницами (meta robots, canonical). Для «сырых» PDF надёжнее HTTP-заголовок на сервере. Если плагин умеет robots для вложений (attachment) – используйте noindex на attachment-страницах, но прямую ссылку на .pdf всё равно лучше закрыть через nginx/Apache.
The SEO Framework – лёгкий вариант для meta/robots страниц; при необходимости смотрите расширения и настройки индексации вложений, не ожидая магии для всех файлов uploads «из коробки».
robots.txt – не единственный и не всегда достаточный инструмент
Disallow в robots.txt просит бота не ходить по пути, но:
- не гарантирует отсутствие URL в индексе (если есть внешние ссылки);
- не заменяет auth;
- для точечного «не индексировать, но отдавать по ссылке» лучше
X-Robots-Tag: noindex.
Пример (дополнение, не замена заголовка):
User-agent: * Disallow: /wp-content/uploads/private-files/
Проверка
curl -sI "https://example.com/wp-content/uploads/private-files/file.pdf" | grep -i robots
Ожидаемо что-то вроде:
X-Robots-Tag: noindex, nofollow
После появления заголовка уже проиндексированные URL можно запросить на удаление в Google Search Console / Яндекс.Вебмастер. Обход и выкидывание из индекса занимают время.
Кратко
- для PDF надёжнее
X-Robots-Tagна nginx/Apache, чем надежда на robots.txt; - хуки WordPress работают только если запрос проходит через PHP;
- noindex не равен защите контента: для секретов нужен доступ, не SEO-заголовок;
- проверяйте
curl -Iи при необходимости чистите URL в панелях вебмастеров.
