Парсинг 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
Получив строку, браузер проходит несколько шагов:
- Определить, URL это или поисковый запрос. Если строка без пробелов, содержит точку или начинается со схемы — это URL. Иначе — поисковый запрос, отправляется в поисковую систему по умолчанию.
- Добавить scheme, если нет. Если введено
example.com, браузер пробуетhttps://example.com(современные браузеры по умолчанию используют HTTPS). Если не отвечает — пробуетhttp://. - Отделить fragment.
#commentsудаляется из строки — браузер сохраняет его для последующей прокрутки, но на сервер не отправляет. - Выделить host и проверить валидность. Домен должен быть синтаксически корректным. Punycode для интернационализированных доменов (IDN):
пример.рфпреобразуется вxn--e1afmkfd.xn--p1ai. - Проверить 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.
Проверь себя
- Чем URI отличается от URL?
- Какой компонент URL не отправляется на сервер?
- Что произойдёт, если ввести в адресную строку
example.comбез scheme?
- URI — общее понятие (строка, идентифицирующая ресурс). URL — это URI, который также указывает, где ресурс находится и как его получить. Любой URL является URI, но не любой URI — URL.
- Fragment (
#...). Он обрабатывается браузером локально для навигации по странице и не включается в HTTP-запрос. - Браузер автоматически добавит
https://и попробует HTTPS-соединение. Если сервер не отвечает на HTTPS — попробуетhttp://.
Что унести с урока
- URL состоит из scheme, host (обязателен), port, path, query и fragment.
- Fragment (
#...) не отправляется на сервер — только браузерная навигация. - Не-ASCII символы кодируются через percent-encoding (%XX).
- Браузер проверяет HSTS-кэш, чтобы изначально использовать HTTPS.
В следующем уроке соберём полный путь — как после парсинга URL браузер последовательно выполняет DNS-запрос, TCP-подключение, TLS-рукопожатие и HTTP-запрос.