ToolDeck

URL Parser

Розбийте URL на компоненти — протокол, хост, шлях, параметри, hash

Спробувати приклад
Також спробуйте:URL Encode OnlineURL Decode Online

Що таке розбір URL?

Розбір URL — це процес розкладання Uniform Resource Locator на окремі складові: протокол (схема), hostname, порт, шлях, параметри запиту та ідентифікатор фрагмента. Кожен 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, який ви вводите, ніколи не залишає ваш пристрій.
🔍
Перевіряйте кожну деталь
Перегляньте протокол, hostname, порт, шлях, рядок запиту, фрагмент та кожен окремий параметр запиту з його декодованим значенням.
📋
Копіюйте окремі компоненти
Натисніть кнопку копіювання поруч із будь-яким полем, щоб отримати точне значення. Не потрібно вручну виділяти та обрізати підрядки.

Сценарії використання парсера URL

Налагодження маршрутизації у фронтенді
Перевіряйте, що сегменти шляху та hash-фрагменти відповідають конфігурації вашого маршрутизатора. Виявляйте зайві слеші або неочікувані параметри запиту ще до того, як вони спричинять помилки 404.
Перевірка ендпоінтів бекенд API
Переконайтеся, що вхідні URL запитів містять правильні hostname, порт і структуру шляху, перш ніж писати обробники маршрутів або проміжне програмне забезпечення.
Тестування правил перенаправлення в DevOps
Під час написання правил перенаправлення для Nginx, Apache або CDN розбирайте вихідний та цільовий URL, щоб переконатися в правильному відповідності кожного компонента.
Перевірка посилань у QA
Розбирайте URL із звітів про тестування або тікетів про помилки, щоб визначити, який параметр запиту або фрагмент спричиняє завантаження неправильної сторінки.
Витягування URL у конвеєрах обробки даних
Витягуйте hostname або сегменти шляху з URL у лог-файлах або аналітичних даних для побудови звітів на рівні доменів або фільтрації трафіку за ендпоінтом.
Вивчення структури URL
Студенти та розробники, які тільки знайомляться з веб-протоколами, можуть вставляти реальні URL і одразу бачити, який роздільник позначає яку межу.

Довідник компонентів URL

Таблиця нижче показує кожну властивість, яку повертає конструктор URL у JavaScript при розборі 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 vs RFC 3986

Два специфікації визначають, як слід розбирати URL. Вони збігаються в базовій структурі, але розходяться в граничних випадках — і саме це розходження зазвичай є причиною того, що браузер обробляє URL інакше, ніж ваш сервер.

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

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

Приклади коду

У кожній популярній мові є вбудований парсер 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?
Конструктор URL у JavaScript потребує базового 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 (застарілий) мав обмеження у 2 083 символи. Більшість вебсерверів за замовчуванням обмежують розмір рядка запиту до 8 КБ (Nginx та 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, оскільки декодовані роздільники на кшталт & та = будуть хибно інтерпретовані.