Определение источника трафика, одна из базовых задач веб-разработки и аналитики. Зная, откуда пришёл посетитель, можно персонализировать контент, оценивать эффективность рекламных каналов и строить собственные CRM-системы. В этой статье разберём все основные способы узнать, с какого сайта или страницы пришёл пользователь.
Что такое HTTP Referer
Когда пользователь переходит по ссылке с одной страницы на другую, браузер автоматически отправляет в HTTP-запросе заголовок Referer (от англ. referrer — «источник перехода»). Этот заголовок содержит URL предыдущей страницы, с которой был совершён переход.
Важно понимать ограничения:
- Если пользователь ввёл адрес вручную или открыл закладку — заголовок будет пустым;
- При переходе с HTTPS на HTTP заголовок обычно не передаётся;
- Некоторые браузеры и расширения блокируют или обрезают Referer из соображений приватности;
- Современные политики Referrer-Policy могут передавать только домен без полного пути.
Способ 1: PHP и переменная $_SERVER[‘HTTP_REFERER’]
Самый распространённый серверный метод — использование суперглобального массива $_SERVER:
Базовый пример:
<?php
if (isset($_SERVER['HTTP_REFERER'])) {
$referer = $_SERVER['HTTP_REFERER'];} else {
echo "Источник перехода неизвестен (прямой заход)";
}
?>
Извлечение только домена источника:
<?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (!empty($referer)) {
$host = parse_url($referer, PHP_URL_HOST);
echo "Домен источника: " . $host;
}
?>
Проверка, пришёл ли пользователь с поисковика:
<?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$searchEngines = ['google.', 'yandex.', 'bing.', 'mail.ru'];
$fromSearch = false;
foreach ($searchEngines as $engine) {
if (stripos($referer, $engine) !== false) {
$fromSearch = true;
break;
}
}
if ($fromSearch) {
// Показываем специальный контент для посетителей из поиска
}
?>
Способ 2: JavaScript и document.referrer
На клиентской стороне аналогом служит свойство document.referrer:
<script>
const referrer = document.referrer;
if (referrer) {
console.log('Пользователь пришёл с:', referrer);
// Отправляем данные на сервер (например, в CRM)
fetch('/save-referer.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({referer: referrer})
});
} else {
console.log('Прямой заход или Referer скрыт');
}
</script>
Этот способ удобен для самописных CRM: данные собираются на клиенте и отправляются на сервер вместе с другой информацией о посетителе (разрешение экрана, язык браузера, часовой пояс).
Способ 3: UTM-метки — самый надёжный вариант
Поскольку Referer ненадёжен, профессионалы используют UTM-метки — специальные параметры в URL:
https://example.com/page?utm_source=google&utm_medium=cpc&utm_campaign=sale
Обработка на PHP:
<?php $utmSource = $_GET['utm_source'] ?? 'не указан'; $utmMedium = $_GET['utm_medium'] ?? 'не указан'; $utmCampaign = $_GET['utm_campaign'] ?? 'не указана'; // Сохраняем в сессию, чтобы не потерять при переходах по сайту session_start; $_SESSION['utm'] = [ 'source' => $utmSource, 'medium' => $utmMedium, 'campaign' => $utmCampaign ]; ?>
Как узнать поисковый запрос
Частый вопрос: можно ли узнать, по какому поисковому запросу пришёл пользователь? К сожалению, в большинстве случаев — нет. Современные поисковые системы (Google, Яндекс) шифруют поисковые запросы и не передают их в Referer. Из заголовка вы получите только адрес поисковика, но не сам запрос.
Альтернативные решения:
- Яндекс.Метрика и Google Analytics — показывают поисковые фразы в агрегированном виде;
- Вебмастер-панели (Яндекс.Вебмастер, Google Search Console) — данные о запросах, по которым сайт показывался в поиске;
- UTM-метки в рекламе — в контекстной рекламе можно передавать ключевое слово через параметр (например, {keyword} в Яндекс.Директе).
Сохранение источника при навигации по сайту
Проблема: когда пользователь переходит по внутренним страницам, Referer меняется на адрес вашего же сайта. Решение — сохранять первоначальный источник в сессии или cookie:
<?php
session_start;
if (!isset($_SESSION['original_referer'])) {
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$myHost = $_SERVER['HTTP_HOST'];
// Сохраняем только если переход был с внешнего сайта
if (!empty($referer) && strpos($referer, $myHost) === false) {
$_SESSION['original_referer'] = $referer;
}}
echo "Первоначальный источник: " ; ($_SESSION['original_referer'] ?? 'прямой заход');
?>
Дополнительная информация о посетителе
Помимо источника перехода, для CRM полезно собирать:
- $_SERVER[‘REMOTE_ADDR’] — IP-адрес посетителя;
- $_SERVER[‘HTTP_USER_AGENT’] — браузер и операционная система;
- $_SERVER[‘REQUEST_METHOD’] — метод запроса (GET, POST и т.д.);
- $_SERVER[‘REQUEST_URI’] — запрошенная страница;
- $_SERVER[‘HTTP_ACCEPT_LANGUAGE’] — предпочитаемый язык.
Для определения источника перехода используйте комбинацию методов: $_SERVER[‘HTTP_REFERER’] на сервере, document.referrer на клиенте и UTM-метки для рекламных кампаний. Помните, что Referer может отсутствовать или быть обрезанным, поэтому не стройте критическую логику сайта только на этом заголовке. Для полноценной аналитики подключите Яндекс.Метрику или Google Analytics — они дадут гораздо больше данных, чем ручной сбор.