Для реализации задачи, когда пользователи могут заходить на сайт только через переход с поисковых систем, но поисковые системы должны иметь доступ к сайту, можно использовать несколько подходов. Однако важно учитывать, что полное ограничение доступа по этому критерию является достаточно сложной задачей, и нельзя полностью полагаться на заголовки HTTP или IP-адреса, так как злоумышленники могут это обойти.
Вот несколько возможных решений:
### 1. Проверка HTTP_REFERER
Вы можете использовать заголовок `HTTP_REFERER`, который указывает, откуда пришёл пользователь. Когда пользователь переходит по ссылке из поисковой системы, этот заголовок будет содержать адрес поисковой системы. В случае прямого ввода адреса в браузере, заголовок может отсутствовать или быть пустым.
```php
<?php
$allowed_referers = ['www.google.com', 'yandex.ru', 'bing.com'];
if (!isset($_SERVER['HTTP_REFERER']) || !preg_match('/' . implode('|', $allowed_referers) . '/i', $_SERVER['HTTP_REFERER'])) {
header('HTTP/1.0 403 Forbidden');
exit('Вы не можете получить доступ к данному сайту напрямую.');
}
?>
```
Однако нужно заметить, что данный метод не является надежным. Некоторые пользователи могут запретить отправку заголовка `HTTP_REFERER`, а есть возможности для его подделки.
### 2. Использование Cookies
Вы можете установить cookie при первой загрузке сайта через поисковую систему. Если пользователь заходит впервые по прямой ссылке, вы можете проверять наличие этой cookie и выдавать ошибку.
```php
<?php
session_start();
if (!isset($_COOKIE['visited'])) {
if (!isset($_SERVER['HTTP_REFERER']) || !preg_match('/google|yandex|bing/i', $_SERVER['HTTP_REFERER'])) {
header('HTTP/1.0 403 Forbidden');
exit('Вы не можете получить доступ к данному сайту напрямую.');
}
setcookie('visited', '1', time() + 3600); // cookie на 1 час
}
?>
```
### 3. CloudFlare
Если вы хотите использовать CloudFlare, то можно настроить правила брандмауэра и создавать правила для разрешения доступа. Например, разрешить доступ только от определенных User-Agent, но это тоже не является полным решением. Однако основное использование CloudFlare в этой ситуации нецелесообразно.
### 4. Серверные настройки
Если у вас есть доступ к серверу, то можно блокировать доступ с помощью конфигурации веб-сервера (например, `.htaccess` для Apache или `nginx.conf` для Nginx). Но стоит учитывать, что подобные правила также могут быть обойдены.
### Заключение
Каждое из описанных решений имеет свои плюсы и минусы, и ни одно из них не может гарантировать абсолютную защиту от прямого доступа. Наилучший подход — это комбинирование нескольких методов. К тому же не забывайте, что блокирование пользователей может негативно сказаться на посещаемости сайта и его репутации.