ToolDeck

Parser URL

Rozłóż URL na jego komponenty — protokół, host, ścieżka, parametry zapytania, hash

Wypróbuj przykład

Czym jest parsowanie URL?

Parsowanie URL to proces rozbicia Jednolitego Lokalizatora Zasobów na jego poszczególne komponenty: protokół (schemat), nazwa hosta, port, ścieżka, parametry zapytania i identyfikator fragmentu. Każdy URL ma strukturę zdefiniowaną przez RFC 3986 i standard WHATWG URL. Parser URL odczytuje surowy ciąg, identyfikuje każdy segment po znakach ograniczników (://, :, /, ?, #, &, =) i zwraca je jako osobne, dostępne pola.

Przeglądarki parsują URL za każdym razem, gdy wpisujesz adres lub klikasz link. Konstruktor URL w JavaScript, moduł urllib.parse w Pythonie i pakiet net/url w Go implementują parsery zgodne z tymi samymi regułami strukturalnymi. Parsowanie URL jest odwrotnością kodowania URL: zamiast przekształcać znaki na potrzeby bezpiecznego przesyłania, rozkładasz już uformowany URL na części, z których się składa.

Typowy URL taki jak https://api.example.com:8080/v1/users?page=2&limit=10#section zawiera sześć odrębnych komponentów. Znaki ograniczników — ://, :, /, ?, &, = i # — sprawiają, że parsowanie jest deterministyczne: każdy z nich sygnalizuje granicę i pozwala parserowi wyodrębniać pola bez niejednoznaczności.

Dlaczego warto używać parsera URL online?

Ręczne dzielenie URL na oko jest podatne na błędy, szczególnie gdy ciąg zawiera zakodowane znaki, wiele parametrów zapytania lub niestandardowe porty. To narzędzie parsuje URL przy użyciu tego samego algorytmu zgodnego ze standardem WHATWG, którego używają przeglądarki, i wyświetla każdy komponent w przejrzystej, dającej się kopiować tabeli.

Natychmiastowe parsowanie w przeglądarce
Wklej dowolny URL i natychmiast zobacz wszystkie rozłożone komponenty. Bez przeładowania strony, bez wywołań serwera, bez oczekiwania.
🔒
Twoje URL-e pozostają prywatne
Parsowanie odbywa się w całości w przeglądarce przy użyciu natywnego API URL. Wpisany adres URL nigdy nie opuszcza Twojego urządzenia.
🔍
Sprawdź każdy szczegół
Zobacz protokół, nazwę hosta, port, ścieżkę, ciąg zapytania, hash oraz każdy indywidualny parametr zapytania z jego zdekodowaną wartością.
📋
Kopiuj poszczególne komponenty
Kliknij przycisk kopiowania przy dowolnym polu, aby pobrać dokładną wartość. Nie musisz ręcznie zaznaczać i przycinać podciągów.

Przypadki użycia parsera URL

Debugowanie routingu frontendowego
Sprawdź, czy segmenty ścieżki i fragmenty hash pasują do konfiguracji routera. Wykryj źle umieszczone ukośniki lub nieoczekiwane parametry zapytania, zanim spowodują błędy 404.
Walidacja endpointów API backendu
Zweryfikuj, czy przychodzące URL-e żądań zawierają prawidłową nazwę hosta, port i strukturę ścieżki, zanim napiszesz handlery tras lub middleware.
Testowanie reguł przekierowań DevOps
Podczas pisania reguł przekierowań dla Nginx, Apache lub CDN, sparsuj oryginalne i docelowe URL-e, aby potwierdzić, że każdy komponent jest poprawnie odwzorowany.
Weryfikacja linków w QA
Parsuj URL-e z raportów testowych lub zgłoszeń błędów, aby wyizolować, który parametr zapytania lub fragment powoduje załadowanie złej strony.
Ekstrakcja URL-i w potokach danych
Wyodrębnij nazwy hostów lub segmenty ścieżek z URL-i w plikach dziennika lub danych analitycznych, aby tworzyć raporty na poziomie domeny lub filtrować ruch według endpointu.
Nauka struktury URL
Studenci i deweloperzy dopiero zaczynający przygodę z protokołami webowymi mogą wklejać prawdziwe URL-e i natychmiast zobaczyć, który ogranicznik wyznacza którą granicę.

Dokumentacja komponentów URL

Poniższa tabela pokazuje każdą właściwość zwracaną przez konstruktor URL w JavaScript podczas parsowania URL. Te same komponenty istnieją w wynikach urlparse Pythona, strukturze url.URL Go i wyjściu parse_url PHP, choć nazwy właściwości różnią się w zależności od języka.

WłaściwośćPrzykładOpis
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

Standard WHATWG URL vs RFC 3986

Dwie specyfikacje definiują sposób parsowania URL-i. Zgadzają się co do podstawowej struktury, ale różnią się w przypadkach brzegowych — i ta różnica jest zwykle przyczyną, gdy przeglądarka obsługuje URL inaczej niż serwer.

WHATWG URL Standard
Używany przez wszystkie nowoczesne przeglądarki i konstruktor URL w JavaScript. Akceptuje i normalizuje niestandardowe dane wejściowe: brakujące schematy, ukośniki odwrotne jako separatory ścieżek, nielatynowe nazwy hostów przez Punycode. Zdefiniowany jako żywy standard pod adresem url.spec.whatwg.org.
RFC 3986
Formalna specyfikacja IETF (2005). Bardziej restrykcyjna niż WHATWG: odrzuca niektóre dane wejściowe, które przeglądarki akceptują. Używana przez wiele bibliotek po stronie serwera, w tym net/url Go i urllib.parse Pythona. Zdefiniowana w RFC 3986.

W praktyce większość różnic pojawia się przy parsowaniu URL-i z międzynarodowymi nazwami domen (IDN), brakującymi schematami lub nietypowymi znakami. Parser WHATWG automatycznie konwertuje nazwy hostów IDN na Punycode, podczas gdy ścisłe parsery RFC 3986 mogą je odrzucać. Jeśli wkleisz URL do tego narzędzia i zobaczysz inne wyniki niż te generowane przez kod po stronie serwera, różnica między WHATWG a RFC 3986 jest najczęstszą przyczyną.

Przykłady kodu

Każdy popularny język posiada wbudowany parser URL. Poniższe przykłady parsują ten sam URL i wyodrębniają jego komponenty. Zwróć uwagę na drobne różnice w nazewnictwie między językami: Python używa scheme zamiast protocol, a Go udostępnia RawQuery zamiast 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"

Często zadawane pytania

Jaka jest różnica między URL a URI?
URL (Uniform Resource Locator) to specyficzny typ URI (Uniform Resource Identifier), który zawiera zarówno identyfikator, jak i mechanizm dostępu (schemat, np. https://). Wszystkie URL-e są URI, ale nie wszystkie URI są URL-ami. URN taki jak urn:isbn:0451450523 to URI identyfikujące zasób po nazwie bez określania, jak go pobrać. W programowaniu webowym terminy te są często używane zamiennie, ponieważ niemal każde napotykane URI jest URL-em.
Jak konstruktor URL obsługuje relative URL-e?
Konstruktor URL w JavaScript wymaga bazowego URL podczas parsowania ścieżek względnych. Wywołanie new URL('/path?q=1') rzuca TypeError. Musisz podać bazę: new URL('/path?q=1', 'https://example.com'). Funkcje urljoin Pythona i url.ResolveReference Go służą temu samemu celowi. To narzędzie oczekuje kompletnych, bezwzględnych URL-i ze schematem.
Co się dzieje, gdy URL nie ma numeru portu?
Gdy port jest pominięty, parser zwraca pusty ciąg dla właściwości port. Przeglądarka przyjmuje domyślny port dla schematu: 443 dla https, 80 dla http, 21 dla ftp. Możesz uzyskać dostęp do efektywnego portu przez właściwość origin lub host, ale samo pole port pozostaje puste, bo żaden jawny port nie został podany.
Czy URL może zawierać znaki Unicode?
Tak, ale muszą być zakodowane na potrzeby przesyłania. Standard WHATWG URL obsługuje to automatycznie: międzynarodowe nazwy domen są konwertowane na Punycode (prefiks xn--), a znaki ścieżki i zapytania spoza zakresu ASCII są kodowane procentowo. Jeśli wkleisz URL z Unicode do tego narzędzia, zobaczysz znormalizowaną, zgodną z ASCII wersję w sparsowanym wyjściu.
Jaka jest maksymalna długość URL?
Żaden standard nie definiuje maksymalnej długości URL — RFC 3986 milczy w tej kwestii. W praktyce przeglądarki narzucają limity: Chrome obsługuje do około 2 MB w pasku adresu, podczas gdy Internet Explorer (starszy) miał limit 2083 znaków. Większość serwerów webowych domyślnie obsługuje 8 KB (Nginx) lub 8 KB (Apache) dla linii żądania. Jeśli musisz przekazywać duże dane, użyj treści żądania POST zamiast ciągów zapytania.
Jak sparsować tylko ciąg zapytania bez pełnego URL?
W JavaScript użyj new URLSearchParams('page=2&limit=10') do parsowania samego ciągu zapytania. W Pythonie użyj urllib.parse.parse_qs('page=2&limit=10'). Obydwa zwracają parametry jako pary klucz-wartość. Jest to przydatne, gdy masz ciąg zapytania w izolacji, na przykład z przesłania formularza lub wpisu w dzienniku, który zawiera tylko część dotyczącą zapytania.
Czy parsowanie URL to to samo co dekodowanie URL?
Nie. Parsowanie URL dzieli URL na komponenty strukturalne (schemat, host, ścieżka, zapytanie, fragment). Dekodowanie URL konwertuje znaki zakodowane procentowo z powrotem do ich oryginalnej postaci (%20 staje się spacją, %26 staje się &). Obie operacje są uzupełniające: zazwyczaj najpierw parsujesz URL, a następnie dekodujesz wartości poszczególnych komponentów. Dekodowanie przed parsowaniem może zniszczyć strukturę URL, ponieważ zdekodowane ograniczniki takie jak & i = zostałyby błędnie zinterpretowane.