ToolDeck

URL Parser

Разбирает URL на компоненты — протокол, хост, путь, параметры запроса, хэш

Попробовать пример
Также попробуйте:URL Encode OnlineURL Decode Online

Что такое разбор URL?

Разбор URL — это процесс разделения Uniform Resource Locator на отдельные компоненты: протокол (схема), имя хоста, порт, путь, параметры запроса и идентификатор фрагмента. Каждый URL следует структуре, определённой в RFC 3986 и стандарте WHATWG URL. Парсер URL читает исходную строку, определяет каждый сегмент по символам-разделителям (://, :, /, ?, #, &, =) и возвращает их как отдельные, доступные поля.

Браузеры выполняют разбор URL каждый раз, когда вы вводите адрес или переходите по ссылке. Конструктор URL в JavaScript, модуль urllib.parse в Python и пакет net/url в Go реализуют парсеры, следующие одним и тем же структурным правилам. Разбор URL — операция, обратная кодированию URL: вместо преобразования символов для безопасной передачи вы разбиваете уже сформированный URL на составляющие его части.

Типичный URL вида https://api.example.com:8080/v1/users?page=2&limit=10#section содержит шесть отдельных компонентов. Символы-разделители — ://, :, /, ?, &, =, и # — делают разбор детерминированным: каждый из них обозначает границу и позволяет парсеру извлекать поля без неоднозначности.

Зачем использовать онлайн-парсер URL?

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

Мгновенный разбор в браузере
Вставьте любой URL и сразу увидите все компоненты. Без перезагрузки страницы, без обращения к серверу, без ожидания.
🔒
Конфиденциальность ваших URL
Разбор выполняется полностью в браузере с использованием нативного URL API. URL, который вы вводите, никогда не покидает ваш компьютер.
🔍
Просмотр каждой детали
Смотрите протокол, имя хоста, порт, путь, строку запроса, хэш и каждый отдельный параметр запроса с его декодированным значением.
📋
Копирование отдельных компонентов
Нажмите кнопку копирования рядом с любым полем, чтобы получить точное значение. Не нужно вручную выделять и обрезать подстроки.

Сценарии использования парсера URL

Отладка frontend-маршрутизации
Проверяйте, что сегменты пути и хэш-фрагменты соответствуют конфигурации вашего роутера. Обнаруживайте лишние слэши или неожиданные параметры запроса до того, как они приведут к ошибкам 404.
Валидация эндпоинтов backend API
Убеждайтесь, что входящие URL запросов содержат правильное имя хоста, порт и структуру пути, прежде чем писать обработчики маршрутов или middleware.
Тестирование правил перенаправления в DevOps
При написании правил перенаправления для Nginx, Apache или CDN разбирайте исходные и целевые URL, чтобы убедиться в правильном маппинге каждого компонента.
Проверка ссылок в QA
Разбирайте URL из тест-отчётов или тикетов с багами, чтобы определить, какой параметр запроса или фрагмент вызывает загрузку неправильной страницы.
Извлечение URL в пайплайнах обработки данных
Извлекайте имена хостов или сегменты пути из URL в лог-файлах или аналитических данных для формирования отчётов на уровне доменов или фильтрации трафика по эндпоинту.
Изучение структуры URL
Студенты и разработчики, впервые сталкивающиеся с веб-протоколами, могут вставлять реальные URL и сразу видеть, какой разделитель обозначает какую границу.

Справочник по компонентам URL

В таблице ниже показаны все свойства, возвращаемые конструктором JavaScript URL при разборе URL. Те же компоненты присутствуют в результате urlparse в Python, структуре url.URL в Go и выводе parse_url в PHP, хотя имена свойств различаются в зависимости от языка.

СвойствоПримерОписание
protocolhttps:Scheme including the trailing colon
hostnameapi.example.comDomain name or IP address
port8080Port number (empty string if default)
pathname/v1/usersPath starting with /
search?page=2&limit=10Query string including the leading ?
hash#sectionFragment identifier including the leading #
originhttps://api.example.com:8080protocol + hostname + port
hostapi.example.com:8080hostname + port
usernameadminCredentials before @ (rarely used in practice)
passwordsecretCredentials before @ (avoid in production URLs)
href(full URL)The complete, serialized URL string

Стандарт WHATWG URL против RFC 3986

Два стандарта определяют правила разбора URL. Они согласованы в отношении базовой структуры, но расходятся в граничных случаях — и именно это расхождение чаще всего является причиной того, что браузер обрабатывает URL иначе, чем сервер.

WHATWG URL Standard
Используется всеми современными браузерами и конструктором JavaScript URL. Принимает и нормализует неточный ввод: отсутствующие схемы, обратные слэши как разделители пути, международные доменные имена через Punycode. Определён как живой стандарт на url.spec.whatwg.org.
RFC 3986
Официальная спецификация IETF (2005 г.). Строже, чем WHATWG: отклоняет некоторые входные данные, которые браузеры принимают. Используется многими серверными библиотеками, включая net/url в Go и urllib.parse в Python. Определён в RFC 3986.

На практике большинство различий проявляется при разборе URL с международными доменными именами (IDN), отсутствующими схемами или нестандартными символами. Парсер WHATWG автоматически преобразует IDN-хосты в Punycode, тогда как строгие парсеры RFC 3986 могут их отклонять. Если вы вставляете URL в этот инструмент и видите результат, отличный от выдаваемого вашим серверным кодом, наиболее вероятная причина — расхождение между WHATWG и RFC 3986.

Примеры кода

В каждом популярном языке есть встроенный парсер URL. Примеры ниже разбирают один и тот же URL и извлекают его компоненты. Обратите внимание на незначительные различия в именах: Python использует scheme вместо protocol, а Go предоставляет RawQuery вместо search.

JavaScript (browser / Node.js)
const url = new URL('https://api.example.com:8080/v1/users?page=2&limit=10#section')

url.protocol  // → "https:"
url.hostname  // → "api.example.com"
url.port      // → "8080"
url.pathname  // → "/v1/users"
url.search    // → "?page=2&limit=10"
url.hash      // → "#section"

// Iterate over query parameters
for (const [key, value] of url.searchParams) {
  console.log(`${key} = ${value}`)
}
// → "page = 2"
// → "limit = 10"

// Modify and re-serialize
url.searchParams.set('page', '3')
url.toString()
// → "https://api.example.com:8080/v1/users?page=3&limit=10#section"
Python
from urllib.parse import urlparse, parse_qs

result = urlparse('https://api.example.com:8080/v1/users?page=2&limit=10#section')

result.scheme    # → 'https'
result.hostname  # → 'api.example.com'
result.port      # → 8080
result.path      # → '/v1/users'
result.query     # → 'page=2&limit=10'
result.fragment  # → 'section'

# Parse query string into a dict
params = parse_qs(result.query)
params['page']   # → ['2']
params['limit']  # → ['10']

# Reconstruct with modifications
from urllib.parse import urlencode, urlunparse
new_query = urlencode({'page': '3', 'limit': '10'})
urlunparse(result._replace(query=new_query))
# → 'https://api.example.com:8080/v1/users?page=3&limit=10#section'
Go
package main

import (
	"fmt"
	"net/url"
)

func main() {
	u, err := url.Parse("https://api.example.com:8080/v1/users?page=2&limit=10#section")
	if err != nil {
		panic(err)
	}

	fmt.Println(u.Scheme)   // → "https"
	fmt.Println(u.Hostname()) // → "api.example.com"
	fmt.Println(u.Port())     // → "8080"
	fmt.Println(u.Path)       // → "/v1/users"
	fmt.Println(u.RawQuery)   // → "page=2&limit=10"
	fmt.Println(u.Fragment)   // → "section"

	// Query params as map
	q := u.Query()
	fmt.Println(q.Get("page"))  // → "2"
	fmt.Println(q.Get("limit")) // → "10"
}
PHP
<?php
$url = 'https://api.example.com:8080/v1/users?page=2&limit=10#section';
$parts = parse_url($url);

$parts['scheme'];   // → "https"
$parts['host'];     // → "api.example.com"
$parts['port'];     // → 8080
$parts['path'];     // → "/v1/users"
$parts['query'];    // → "page=2&limit=10"
$parts['fragment']; // → "section"

// Parse query string into an array
parse_str($parts['query'], $params);
$params['page'];    // → "2"
$params['limit'];   // → "10"

Часто задаваемые вопросы

В чём разница между URL и URI?
URL (Uniform Resource Locator) — это конкретный тип URI (Uniform Resource Identifier), который включает как идентификатор, так и механизм доступа (схему, например https://). Все URL являются URI, но не все URI являются URL. URN вида urn:isbn:0451450523 — это URI, который идентифицирует ресурс по имени, не указывая способ его получения. В веб-разработке эти термины часто используются взаимозаменяемо, поскольку почти каждый встречающийся URI является URL.
Как конструктор URL обрабатывает относительные URL?
Конструктор JavaScript URL требует базового URL при разборе относительных путей. Вызов new URL('/path?q=1') выбрасывает TypeError. Необходимо указать базу: new URL('/path?q=1', 'https://example.com'). urljoin в Python и url.ResolveReference в Go выполняют ту же функцию. Этот инструмент ожидает полные, абсолютные URL со схемой.
Что происходит, когда в URL не указан порт?
Если порт не указан, парсер возвращает пустую строку для свойства port. Браузер предполагает порт по умолчанию для схемы: 443 для https, 80 для http, 21 для ftp. Эффективный порт можно получить через свойство origin или host, но поле port остаётся пустым, поскольку явный порт не был задан.
Может ли URL содержать символы Unicode?
Да, но для передачи они должны быть закодированы. Стандарт WHATWG URL обрабатывает это автоматически: международные доменные имена преобразуются в Punycode (префикс xn--), а символы пути и запроса за пределами диапазона ASCII кодируются в процентном формате. Если вы вставите URL с Unicode в этот инструмент, в результатах разбора вы увидите нормализованную, безопасную для ASCII версию.
Какова максимальная длина URL?
Ни один стандарт не определяет максимальную длину URL — RFC 3986 обходит этот вопрос стороной. На практике браузеры устанавливают ограничения: Chrome поддерживает до примерно 2 МБ в адресной строке, тогда как Internet Explorer (устаревший) имел ограничение в 2083 символа. Большинство веб-серверов по умолчанию ограничивают строку запроса 8 КБ (Nginx) или 8 КБ (Apache). Если вам нужно передавать большие объёмы данных, используйте тело POST-запроса вместо параметров запроса.
Как разобрать только строку запроса без полного URL?
В JavaScript используйте new URLSearchParams('page=2&limit=10') для разбора голой строки запроса. В Python используйте urllib.parse.parse_qs('page=2&limit=10'). Оба варианта возвращают параметры в виде пар ключ-значение. Это удобно, когда у вас есть только строка запроса — например, из отправки формы или записи лога, в которой зафиксирована лишь часть запроса.
Одно и то же ли разбор URL и декодирование URL?
Нет. Разбор URL разделяет URL на структурные компоненты (схема, хост, путь, запрос, фрагмент). Декодирование URL преобразует символы в процентном кодировании обратно в исходный вид (%20 становится пробелом, %26 становится &). Эти две операции дополняют друг друга: как правило, сначала разбирают URL, а затем декодируют значения отдельных компонентов. Декодирование перед разбором может нарушить структуру URL, поскольку декодированные разделители, такие как & и =, будут неверно интерпретированы.