Как ограничить доступ к сайту только через поисковые системы
Многие владельцы сайтов хотят защитить свой ресурс от прямых переходов, оставив его доступным только для посетителей из поисковиков (Яндекс, Google) и для самих поисковых ботов. Такая задача часто возникает при создании приватных баз данных, партнёрских сеток или временных лендингов. В этой статье разберём, как реализовать подобную фильтрацию с помощью Cloudflare, проверки HTTP-реферера и User-Agent.
Принцип работы: реферер и User-Agent
Когда пользователь переходит на сайт из поисковой системы, браузер передаёт HTTP-заголовок Referer, содержащий адрес поисковика (например, https://www.google.com/ или https://yandex.ru/). Поисковые боты (Googlebot, YandexBot) имеют специальный User-Agent. Сервер может анализировать эти данные и принимать решение: показать контент или вернуть ошибку (403, 404 или редирект).
Настройка через Cloudflare Workers
Cloudflare - популярный сервис CDN, который позволяет выполнять собственный код на границе сети. Используя Cloudflare Workers, вы можете перехватывать каждый запрос и проверять его происхождение. Вот пример простого скрипта:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const referer = request.headers.get('Referer') || '';
const userAgent = request.headers.get('User-Agent') || '';
const allowedReferers = ['google.com', 'yandex.ru', 'bing.com'];
const isBot = /bot|crawl|spider/i.test(userAgent);
// Разрешаем ботам и переходам из поисковиков
if (isBot || allowedReferers.some(r => referer.includes(r))) {
return fetch(request);
}
// Иначе возвращаем ошибку 403
return new Response('Access Denied', { status: 403 });
}
Этот код проверяет, пришёл ли пользователь с поисковика или является ботом. Если нет - отдаёт 403. Вы можете также настроить редирект на другой домен или поддомен, как в примере с seeddbaza.quest.
Альтернативный способ: через .htaccess (Apache)
Если ваш сайт работает на Apache, можно использовать файл .htaccess для проверки реферера:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?google\. [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yandex\. [NC]
RewriteCond %{HTTP_USER_AGENT} !(bot|crawl|spider) [NC]
RewriteRule ^.*$ - [F,L]
Эта директива блокирует всех, кто не пришёл с Google или Яндекса и не является ботом. Для Nginx аналогичная логика реализуется через блок if в конфигурации сервера.
Важные нюансы и подводные камни
- Реферер можно подделать - опытный пользователь может отправить запрос с подменённым заголовком. Это защита от случайных посетителей, а не от хакеров.
- Поисковые боты могут не передавать реферер - поэтому в коде обязательно проверяйте User-Agent, иначе боты не увидят сайт.
- Прямые переходы из закладок, мессенджеров или соцсетей будут заблокированы. Если вам нужно оставить доступ из соцсетей, добавьте их домены в список разрешённых.
- Кеширование Cloudflare - если вы используете Workers, убедитесь, что кеш не отдаёт старую версию страницы для всех пользователей.
Как работает пример с seeddbaza.quest
В упомянутом примере при прямом вводе адреса сайт возвращает ошибку (вероятно, 403 или 404). При переходе из поисковика (Яндекс или Google) происходит редирект на сторонний поддомен. Это достигается комбинацией проверки реферера и правил переадресации на уровне Cloudflare Page Rules или Workers. Реферер от поисковика активирует редирект, а без него - блокировка.
Проверка и отладка
После настройки обязательно протестируйте работу: откройте сайт напрямую (должна быть ошибка), затем перейдите по ссылке из результатов поиска (должен открыться контент). Также используйте инструменты вроде curl с подменой реферера:
curl -I -e 'https://www.google.com/' https://вашсайт.ру
Убедитесь, что поисковые боты (например, через Google Search Console) видят сайт как рабочий и не получают ошибок.
Заключение
Настройка доступа к сайту только через поисковые системы - реальная задача, решаемая с помощью Cloudflare Workers, .htaccess или конфигурации Nginx. Главное - правильно комбинировать проверку реферера и User-Agent, чтобы не заблокировать сами поисковые боты. Помните, что это не абсолютная защита, но эффективный фильтр для массового трафика.