User-Agent: как читать строку и что она говорит о вас

6 ноября 2026 г.
User-Agent: как читать строку и что она говорит о вас

В логе сервера между временем запроса и адресом страницы стоит длинная строка вроде Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36. Она приходит с каждого обращением к сайту и сообщает, кто именно пришёл. Разобрать её на части занимает десять минут, а понятная строка сразу отвечает на вопрос, кто ходит по сайту и можно ли этому посетителю доверять.

Что такое User-Agent

User-Agent это HTTP-заголовок, который клиент отправляет серверу вместе с запросом. Он не обязателен: сервер обязан работать и без него. Внутри строки браузер или программа старается описать себя максимально подробно: название и версию программы, операционную систему, архитектуру процессора, иногда язык и настройки.

  • браузер отправляет строку, чтобы сервер мог отдать подходящую версию страницы, картинки и код;
  • скрипты и библиотеки отправляют собственные строки, часто с именем проекта и версией;
  • поисковые краулеры отправляют свои строки, чтобы вебмастер мог их опознать и настроить правила;
  • строка видна любому, кто обрабатывает запрос, поэтому её считают одним из факторов идентификации, хотя надёжной идентификацией она не является.

Технически это обычный заголовок с именем User-Agent и значением в свободной форме. Правил о формате нет, есть только традиция: принято писать «название/версия», а подробности класть в круглые скобки. Именно поэтому разбор строки всегда сводится к попытке понять, кто её составил.

Из каких частей состоит строка

Возьмём настоящую строку Chrome на Windows и разрежем её на куски. Каждый кусок несёт свой смысл, и почти все они нужны для того, чтобы понять, с какого устройства пришёл запрос.

Разбор строки по частям
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
  (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36

Mozilla/5.0            токен совместимости, исторический остаток
Windows NT 10.0        операционная система (так сообщают и Win 10, и Win 11)
Win64; x64             разрядность и архитектура
AppleWebKit/537.36     движок отрисовки, точнее WebKit
(KHTML, like Gecko)    флаг совместимости с поведением Gecko
Chrome/131.0.0.0       название браузера и старшая версия
Safari/537.36          токен совместимости с версией движка

Почему в строке столько постороннего: каждый браузер когда-то был новым, и сайты проверяли строку на признаки «старого» клиента. Chrome подставляет и AppleWebKit, и Safari, чтобы не выглядеть для таких проверок чем-то незнакомым. Отсюда и название Mozilla при том, что никакого Mozilla внутри нет.

Сравните, как выглядят другие браузеры, и сразу станет видно, где границы полей.

Другие браузеры и устройства
Firefox:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0

iPhone, Safari:
Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15
  (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1

Android, Chrome:
Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36
  (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36

У Firefox здесь два отдельных токена: rv со значением Gecko и служебная дата Gecko/20100101, по которой отличают современный Gecko от Netscape из девяностых. У Safari версия стоит на токене Version, а не на имени браузера. У телефонов появляется слово Mobile, а у планшетов его нет, поэтому по наличию Mobile устройство обычно и определяют.

Боты и краулеры

Краулеры тоже отправляют User-Agent, и в этом одновременно их главное удобство и главный недостаток. Поисковые роботы сообщают, кто они, чтобы вебмастер мог настроить обход правильно. Обычно в конце строки у них есть адрес страницы с описанием бота.

Как выглядят строки известных ботов
Googlebot:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

YandexBot:
Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)

GPTBot:
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible;
  GPTBot/1.1; +https://openai.com/gptbot

Слово compatible в начале означает, что клиент не настоящий браузер, а программа, которая ведёт себя с сайтом по-браузерному. У Googlebot и YandexBot в конце стоит ссылка на страницу с описанием, а у поисковых роботов Яндекса есть отдельные имена для разных задач, например YandexImages или YandexVideo, и они отличаются частью строки.

Отдельно стоит сказать про ботов, связанных с генеративным искусственным интеллектом. У OpenAI их несколько, и это разные программы с разными задачами: GPTBot обходит интернет для обучения моделей, ChatGPT-User ходит по страницам по запросу пользователя в чате, OAI-SearchBot обслуживает поиск. Состав ботов у любого оператора меняется, поэтому списки разумно сверять заново, а не полагаться на список из статьи двухлетней давности.

Строка опознания полезна, но проверять бота по ней нельзя. Настоящий способ убедиться, что запрос сделал именно Googlebot или YandexBot, это обратный DNS-запрос по адресу: у поисковиков есть специальные имена и опубликованные диапазоны адресов. Именно эта проверка отличает настоящего робота от того, кто просто подставил чужое имя в строку.

Как заблокировать нежелательного бота

Способы зависят от того, где вы хотите оборвать запрос. Самый вежливый вариант это robots.txt: добавьте запись с именем бота и запретом на конкретный путь. Добросовестный бот её послушает, но это именно просьба, а не запрет.

Три способа отсечь бота
1. robots.txt, просьба боту:
   User-agent: GPTBot
   Disallow: /

2. Apache, .htaccess, жёсткий запрет:
   RewriteEngine On
   RewriteCond %{HTTP_USER_AGENT} (GPTBot|OAI-SearchBot) [NC]
   RewriteRule ^ - [F,L]

3. nginx, запрет по заголовку:
   if ($http_user_agent ~* "(GPTBot|OAI-SearchBot)") { return 403; }

Про nginx стоит знать особенность: директива if работает только в контексте location или server, и в директиве server её лучше не писать. Практичный вариант оформляется через map на уровне http: заранее описать правило, а потом вызвать его одним условием. Если бот лезет на сайт тысячи раз в сутки, надёжнее добавить фильтр по IP-адресам и по частоте запросов, а не полагаться только на строку.

Главное ограничение всех этих способов: запрет по User-Agent обходится одной строкой в коде. Любой бот может отправить строку обычного браузера и получить обычный сайт. Поэтому такая блокировка спасает от наивных краулеров и от тех, кто не стал заморачиваться, но против целенаправленного сбора данных она бесполезна. Если угроза реальная, нужны лимиты по запросам, проверка поведения и, для чувствительных разделов, авторизация.

Как скрыть свой User-Agent

Иногда строку нужно поменять: чтобы получить мобильную версию сайта на десктопе, чтобы обойти сайт, который отдаёт пустую страницу незнакомому клиенту, или чтобы протестировать, как страница ведёт себя для поискового робота.

Подмена User-Agent из командной строки
curl -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) Mobile/15E148" https://example.com

Python, requests:
import requests
r = requests.get(
    "https://example.com",
    headers={"User-Agent": "MyBot/1.0 (+https://example.com/bot)"},
)
print(r.status_code)

В браузере строку меняют расширения: они перехватывают запрос и подставляют своё значение. Собственный User-Agent указывают и в настройках приложений, и в конфигурации тестовых окружений, чтобы отличать служебные обращения от пользовательских. Менять строку ради приватности не стоит: она давно перестала быть надёжным идентификатором, и это пойдёт отдельным разделом.

Почему User-Agent не идентификация

Строку присылает клиент, а значит, прислать может что угодно. Ровно поэтому за последние годы к ней стали относиться как к подсказке, а не как к доказательству.

  • любой скрипт может отправить строку Chrome, Firefox или Safari и получить полную версию сайта;
  • множество разных людей присылают одинаковую строку, потому что у них одинаковый браузер и одна и та же версия системы;
  • версия браузера в строке сокращена, поэтому по ней нельзя понять, что за сборка стоит на машине;
  • строка передаётся каждому сайту, который вы открываете, и сама по себе стала инструментом слежки;
  • по ней нельзя понять, человек это или робот: бот может назваться человеком, а человек запустить скрипт.

Как только надёжность исчезла, естественным образом появился вопрос, а что придёт взамен. Ответом стали Client Hints, и это следующая тема.

Client Hints: что пришло на смену

Идея в том, чтобы не отправлять всю строку целиком, а сообщать серверу ровно столько, сколько ему действительно нужно, и только если он это запросил. Браузеры на базе Chromium с 2020 года постепенно урезали User-Agent, а недостающие данные передают отдельными заголовками.

Заголовки User-Agent Client Hints
Sec-CH-UA: "Chromium";v="131", "Google Chrome";v="131", "Not_A Brand";v="24"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"

Дополнительные, если сервер их запросил:
Sec-CH-UA-Full-Version-List
Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Model
Sec-CH-UA-Platform-Version, Sec-CH-UA-Form-Factors

Три заголовка низкой энтропии отправляются по умолчанию с каждым запросом: бренды браузера с версией, признак мобильного устройства и платформа. Остальные отправляются только после того, как сервер объявил их через заголовок Accept-CH. Логика в том, что обычному сайту достаточно знать, мобильный перед ним посетитель или нет, а полная картина с архитектурой и точной версией доступна только тем, кто действительно её запросил.

Для разбора строки на практике этого достаточно: разбор User-Agent показывает браузер с версией, операционную систему, тип устройства и отдельно распознаёт ботов, а если строка нестандартная, её можно разобрать регулярным выражением в тестере регулярных выражений. Как вообще устроены шаблоны для таких задач, показано в статье о регулярных выражениях для новичков.

Стоит знать и об ограничениях разбора. Версию Windows по строке определить можно, но не подробнее, чем «NT 10.0», а это одновременно и десятая, и одиннадцатая версия. Разрядность и архитектуру видно, но модель процессора нет. Планшет и телефон на Android различаются по наличию слова Mobile, а вот версию движка по строке уже не восстановить: она там намеренно неполная.

Частые вопросы

Можно ли по User-Agent определить, что это робот?

Попробовать можно, но результат ненадёжен. Любой скрипт вправе отправить строку обычного браузера и получить обычный сайт. Поэтому User-Agent используют как фильтр первого уровня, а серьёзную защиту строят по адресам, частоте запросов и характеру поведения. Блокировка по строке отсекает тех, кто не стал заморачиваться.

Что означает Mozilla/5.0, если это не Mozilla?

Исторический остаток. Mozilla продолжила проект Netscape, и к началу двухтысячных почти все браузеры стали начинать строку с Mozilla/5.0, потому что сайты проверяли этот префикс и иначе показывали устаревшую страницу. Позже к нему добавились Safari и Chrome, чтобы старые проверки продолжали работать, так что в современной строке нет ни одного элемента, который что-то значит буквально.

Почему у Chrome в версии нули?

Это результат сокращения User-Agent в Chromium. Браузер сообщает только старшую версию, а остальные компоненты заменяет нулями, чтобы усложнить опознание конкретной сборки и затруднить слежку. Firefox и Safari пока отправляют полную строку, но движение идёт в ту же сторону, а недостающие данные приходят в Client Hints.

Влияет ли User-Agent на выдачу в поиске?

Косвенно да. Поисковики пользуются строкой, чтобы понять, мобильный ли посетитель, какую версию страницы отдать и как разбирать ошибки рендеринга. Проблема в том, что после сокращения версии браузера в строке больше нет, поэтому полноценный разбор приходится делать по Client Hints, а не по самой строке.

Нужно ли разбирать User-Agent на своём сайте?

Чаще всего да, и вот зачем: выбрать мобильную или десктопную версию, отдать мобильным посетителям облегчённый код, собрать статистику по браузерам, отсечь часть ботов. Чего делать не стоит: принимать решения о доступе или оплате только на основании этой строки, потому что её пишет тот, кто её присылает.

Разбирайте строку в два приёма. Сначала посмотрите на ключевые слова вроде Mobile, Tablet, Bot и на имя браузера, они дают восемьдесят процентов информации. Потом проверьте, что строка не содержит подозрительных признаков: пустых значений, невозможных сочетаний версий или известного имени бота, которое вы решаете блокировать.

Читайте также