← Назад к вопросам

Как сервер определяет браузер пользователя

2.3 Middle🔥 131 комментариев
#Веб-тестирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Определение браузера пользователя на стороне сервера

Сервер определяет браузер пользователя (а также операционную систему, устройство и другие характеристики) путем анализа HTTP-заголовка User-Agent, который автоматически отправляется клиентом при каждом запросе. Этот заголовок содержит строку (User-Agent string), составленную по определенным соглашениям.

Структура User-Agent строки

Типичная строка User-Agent имеет следующий формат: Product/Version (Комментарий1; Комментарий2; ...)

Например, для Chrome на Windows:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

Разберем компоненты:

  • Mozilla/5.0 — исторический токен совместимости.
  • (Windows NT 10.0; Win64; x64) — платформа (ОС и архитектура).
  • AppleWebKit/537.36 — движок рендеринга.
  • (KHTML, like Gecko) — указание на поддержку стандартов.
  • Chrome/120.0.0.0 — ключевой идентификатор браузера и его версия.
  • Safari/537.36 — дополнительный токен для совместимости.

Алгоритм определения на сервере

На стороне сервера (например, в коде бэкенда на Python, PHP, Node.js) процесс выглядит так:

  1. Извлечение заголовка: Серверное приложение получает значение заголовка User-Agent из входящего HTTP-запроса.
  2. Парсинг и анализ: Строка анализируется на наличие уникальных идентификаторов браузеров и платформ. Обычно это делается путем сопоставления с известными шаблонами (регулярными выражениями).

Пример кода на Python (с использованием библиотеки user-agents)

from user_agents import parse

# Предположим, это строка, полученная из HTTP-заголовка
user_agent_string = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"

# Парсинг строки
user_agent = parse(user_agent_string)

# Извлечение информации
print(f"Браузер: {user_agent.browser.family} {user_agent.browser.version_string}")
# Вывод: Браузер: Chrome 120.0.0.0
print(f"ОС: {user_agent.os.family} {user_agent.os.version_string}")
# Вывод: ОС: Windows 10
print(f"Устройство: {user_agent.device.family}")
# Вывод: Устройство: Other
print(f"Это мобильное устройство? {user_agent.is_mobile}")
# Вывод: Это мобильное устройство? False
print(f"Это бот? {user_agent.is_bot}")
# Вывод: Это бот? False

Пример на PHP (без внешних библиотек, базовый анализ)

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

if (stripos($user_agent, 'Chrome') !== false && stripos($user_agent, 'Edg') === false) {
    // Важно исключить Edge на Chromium, который также содержит 'Chrome'
    $browser = 'Google Chrome';
} elseif (stripos($user_agent, 'Firefox') !== false) {
    $browser = 'Mozilla Firefox';
} elseif (stripos($user_agent, 'Edg') !== false) {
    $browser = 'Microsoft Edge';
} elseif (stripos($user_agent, 'Safari') !== false && stripos($user_agent, 'Chrome') === false) {
    $browser = 'Apple Safari';
} else {
    $browser = 'Другой браузер';
}

echo "Определенный браузер: " . $browser;
?>

Для чего это используется? (Use Cases)

  • Адаптивная верстка и редиректы: Редко используется сегодня, так как предпочтение отдается CSS Media Queries. Однако для мобильных приложений или особых версий сайта редирект по User-Agent возможен.
  • Сбор аналитики: Понимание доли рынка браузеров и ОС среди пользователей.
  • Отладка и логирование: Запись информации о клиенте в логи для диагностики проблем, специфичных для определенных браузеров.
  • Безопасность: Блокировка запросов от известных вредоносных ботов или сканеров, чьи User-Agent строки легко идентифицировать.
  • Обеспечение совместимости: Сервер может отправлять немного разный код или полифиллы для старых браузеров (например, IE).

Важные ограничения и современные тенденции

  1. Ненадежность: User-Agent строку можно легко подделать (spoof). Многие браузеры позволяют ее изменять через расширения или встроенные инструменты разработчика.
  2. Усложнение строк: Современные браузеры (особенно на Chromium) включают в строку множество токенов для обратной совместимости, что делает парсинг сложнее.
  3. Инициатива сокращения User-Agent (User-Agent Reduction): Google Chrome и другие браузеры постепенно уменьшают объем информации в стандартном User-Agent, оставляя только общую версию браузера и ОС. Это часть политики конфиденциальности. Для получения детальной информации рекомендуется использовать Client Hints API.
  4. Client Hints: Современный, разрешительный механизм, при котором сервер может запросить у браузера конкретную информацию (например, полную версию, модель устройства) через HTTP-заголовки. Браузер может предоставить эти данные, если пользователь не запретил это.

Вывод: Несмотря на историческую роль User-Agent как основного источника данных о клиенте, в современной веб-разработке к этим данным следует относиться как к ориентировочным. Для критически важной логики, основанной на возможностях браузера, предпочтительнее использовать обнаружение возможностей (Feature Detection) на стороне клиента с помощью JavaScript. User-Agent остается полезным инструментом для аналитики, логирования и начальной загрузки страницы, но его точность и полнота целенаправленно ограничиваются в угоду приватности пользователей.