Парсинг URL

Парсинг URL

Ты набираешь в адресной строке https://example.com/blog/post?id=5#comments и жмёшь Enter. Что происходит в первые миллисекунды? Браузер должен понять, что ты хочешь. Этот процесс называется парсингом URL — разбор адреса на компоненты. Разберём, из чего состоит URL и как браузер его интерпретирует.

URL, URI, URN — в чём разница

Часто эти термины путают, но разница проста:

  • URI (Uniform Resource Identifier) — общее понятие: строка, идентифицирующая ресурс. URL и URN — это подвиды URI.
  • URL (Uniform Resource Locator) — URI, который не только идентифицирует, но и говорит, ГДЕ ресурс находится и КАК его получить. https://example.com/page — это URL.
  • URN (Uniform Resource Name) — URI, который только именует ресурс, без указания местоположения. urn:isbn:0-486-27557-4 — это URN (идентификатор книги).

На практике 99% того, с чем мы работаем — это URL. Термин URI используют в спецификациях и документации, но в быту говорят «URL».

Анатомия URL

Разберём полный URL на компоненты:

https://username:password@example.com:443/blog/post?id=5#comments
└─┬──┘ └──────┬──────┘ └────┬────┘ └┬┘ └───┬────┘ └─┬─┘ └──┬───┘
 scheme     userinfo        host   port   path    query  fragment
(протокол) (учётные          (домен) (порт) (путь)  (GET-   (якорь)
            данные)                                параметры)

Каждый компонент:

  • Scheme (протокол). https, http, ws, ftp, mailto. Определяет, по какому протоколу обращаться к серверу. Браузер использует scheme для выбора порта по умолчанию (443 для https, 80 для http) и механизма соединения (TLS для https, TCP напрямую для http).
  • Userinfo. username:password. Редкий компонент. Раньше использовался для HTTP Basic Auth, сейчас считается небезопасным и не поддерживается современными браузерами (игнорируется).
  • Host (домен или IP). example.com или 93.184.216.34. Единственный обязательный компонент после scheme. Остальное может отсутствовать.
  • Port. :443. Явное указание порта. Если не указан, используется порт по умолчанию для scheme (80 HTTP, 443 HTTPS).
  • Path. /blog/post. Иерархический путь к ресурсу на сервере. Чувствителен к регистру на Unix-серверах, нечувствителен на Windows.
  • Query. ?id=5. Пары ключ=значение, разделённые &: ?id=5&lang=ru. Передаются на сервер и доступны в коде (GET-параметры).
  • Fragment (якорь). #comments. Указатель на часть страницы. Не отправляется на сервер — обрабатывается только браузером для прокрутки к элементу с соответствующим id.

Кодирование URL (Percent-encoding)

URL может содержать только ASCII-символы из ограниченного набора. Пробелы, кириллица, спецсимволы должны кодироваться. Механизм — percent-encoding: % + две hex-цифры кода символа:

Пробел       → %20
Символ @     → %40
Кириллица   → %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82 (слово «привет» в UTF-8)

Современные браузеры автоматически кодируют URL при вводе не-ASCII символов. Ты вводишь example.com/поиск, браузер отправляет example.com/%D0%BF%D0%BE%D0%B8%D1%81%D0%BA. DNS-серверы и веб-серверы работают только с ASCII.

Что делает браузер при вводе URL

Получив строку, браузер проходит несколько шагов:

  1. Определить, URL это или поисковый запрос. Если строка без пробелов, содержит точку или начинается со схемы — это URL. Иначе — поисковый запрос, отправляется в поисковую систему по умолчанию.
  2. Добавить scheme, если нет. Если введено example.com, браузер пробует https://example.com (современные браузеры по умолчанию используют HTTPS). Если не отвечает — пробует http://.
  3. Отделить fragment. #comments удаляется из строки — браузер сохраняет его для последующей прокрутки, но на сервер не отправляет.
  4. Выделить host и проверить валидность. Домен должен быть синтаксически корректным. Punycode для интернационализированных доменов (IDN): пример.рф преобразуется в xn--e1afmkfd.xn--p1ai.
  5. Проверить HSTS-кэш. Если домен в HSTS Preload List или кэше браузера — использовать только HTTPS, HTTP не пробовать.

Пример разбора URL

Возьмём URL https://shop.example.com/products?category=books&sort=price#list. После парсинга браузер получает:

scheme:   https
host:     shop.example.com
port:     443 (по умолчанию для https)
path:     /products
query:    category=books&sort=price
fragment: list

Имея эти компоненты, браузер переходит к следующему этапу — разрешению доменного имени через DNS.

Проверь себя

  1. Чем URI отличается от URL?
  2. Какой компонент URL не отправляется на сервер?
  3. Что произойдёт, если ввести в адресную строку example.com без scheme?
<details> <summary>Ответы</summary>
  1. URI — общее понятие (строка, идентифицирующая ресурс). URL — это URI, который также указывает, где ресурс находится и как его получить. Любой URL является URI, но не любой URI — URL.
  2. Fragment (#...). Он обрабатывается браузером локально для навигации по странице и не включается в HTTP-запрос.
  3. Браузер автоматически добавит https:// и попробует HTTPS-соединение. Если сервер не отвечает на HTTPS — попробует http://.
</details>

Что унести с урока

  • URL состоит из scheme, host (обязателен), port, path, query и fragment.
  • Fragment (#...) не отправляется на сервер — только браузерная навигация.
  • Не-ASCII символы кодируются через percent-encoding (%XX).
  • Браузер проверяет HSTS-кэш, чтобы изначально использовать HTTPS.

В следующем уроке соберём полный путь — как после парсинга URL браузер последовательно выполняет DNS-запрос, TCP-подключение, TLS-рукопожатие и HTTP-запрос.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике