ToolDeck

URL Parser

Splits een URL op in de onderdelen — protocol, host, pad, queryparameters, hash

Probeer een voorbeeld

Wat is URL-parsing?

URL-parsing is het proces waarbij een Uniform Resource Locator wordt opgesplitst in de afzonderlijke onderdelen: protocol (scheme), hostnaam, poort, padnaam, queryparameters en fragmentidentificator. Elke URL volgt een structuur die is vastgelegd in RFC 3986 en de WHATWG URL-standaard. Een URL-parser leest de ruwe tekenreeks, identificeert elk segment aan de hand van scheidingstekens (://, :, /, ?, #, &, =) en geeft ze terug als afzonderlijke, toegankelijke velden.

Browsers voeren URL-parsing uit bij elke adresinvoer of klik op een link. De JavaScript URL-constructor, Pythons urllib.parse-module en Go's net/url-pakket implementeren parsers die dezelfde structuurregels volgen. Een URL parsen is het omgekeerde van URL-codering: in plaats van tekens transformeren voor veilig transport, split je een al gevormde URL op in de samenstellende delen.

Een typische URL zoals https://api.example.com:8080/v1/users?page=2&limit=10#section bevat zes afzonderlijke onderdelen. De scheidingstekens — ://, :, /, ?, &, =, en # — maken het parsen deterministisch: elk teken markeert een grens en stelt de parser in staat velden zonder ambiguïteit te extraheren.

Waarom een online URL-parser gebruiken?

Een URL handmatig met het oog opsplitsen is foutgevoelig, zeker wanneer de tekenreeks gecodeerde tekens, meerdere queryparameters of niet-standaard poorten bevat. Dit hulpmiddel parseert de URL met hetzelfde WHATWG-conforme algoritme als browsers en toont elk onderdeel in een overzichtelijke, kopieerbare tabel.

Direct parsen in uw browser
Plak een URL en zie alle onderdelen onmiddellijk opgesplitst. Geen pagina herladen, geen serveraanroep, geen wachttijd.
🔒
Uw URL's blijven privé
Het parsen verloopt volledig in uw browser via de native URL API. De URL die u invoert verlaat uw computer nooit.
🔍
Elk detail in één oogopslag
Bekijk protocol, hostnaam, poort, padnaam, querystring, hash en elke afzonderlijke queryparameter met de gedecodeerde waarde.
📋
Kopieer afzonderlijke onderdelen
Klik op de kopieerknop naast een veld om de exacte waarde op te slaan. Geen handmatig selecteren en bijknippen van subtekenreeksen.

Toepassingen van de URL-parser

Debuggen van frontend-routing
Controleer of padsegmenten en hashfragmenten overeenkomen met uw routerconfiguratie. Spoor misplaatste slashes of onverwachte queryparameters op voordat ze 404-fouten veroorzaken.
Validatie van backend-API-eindpunten
Verifieer dat inkomende verzoek-URL's de juiste hostnaam, poort en padstructuur bevatten voordat u route-handlers of middleware schrijft.
Testen van DevOps-omleidingsregels
Bij het schrijven van Nginx-, Apache- of CDN-omleidingsregels kunt u de bron- en doel-URL's parsen om te bevestigen dat elk onderdeel correct wordt gemapt.
QA-linkverificatie
Parseer URL's uit testrapporten of bugtickets om te isoleren welke queryparameter of welk fragment de verkeerde pagina laadt.
URL-extractie in datapipelines
Extraheer hostnamen of padsegmenten uit URL's in logbestanden of analysedata om rapporten op domeinniveau te bouwen of verkeer te filteren per eindpunt.
URL-structuur leren begrijpen
Studenten en ontwikkelaars die nieuw zijn met webprotocollen kunnen echte URL's plakken en direct zien welk scheidingsteken welke grens markeert.

Overzicht van URL-onderdelen

De onderstaande tabel toont alle eigenschappen die de JavaScript URL-constructor teruggeeft bij het parsen van een URL. Dezelfde onderdelen bestaan in Pythons urlparse-resultaat, Go's url.URL-struct en PHP's parse_url-uitvoer, hoewel eigenschapsnamen per taal verschillen.

EigenschapVoorbeeldBeschrijving
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-standaard versus RFC 3986

Twee specificaties bepalen hoe URL's worden geparseerd. Ze zijn het eens over de basisstructuur, maar wijken af bij randgevallen — en die afwijking is doorgaans de oorzaak als uw browser een URL anders verwerkt dan uw server.

WHATWG URL Standard
Gebruikt door alle moderne browsers en de JavaScript URL-constructor. Accepteert en normaliseert onzorgvuldige invoer: ontbrekende schema's, backslashes als padscheidingstekens, niet-ASCII-hostnamen via Punycode. Vastgelegd als levende standaard op url.spec.whatwg.org.
RFC 3986
De formele IETF-specificatie (2005). Strenger dan WHATWG: verwerpt bepaalde invoer die browsers wel accepteren. Gebruikt door veel server-side bibliotheken, waaronder Go's net/url en Pythons urllib.parse. Vastgelegd in RFC 3986.

In de praktijk treden de meeste verschillen op bij URL's met internationale domeinnamen (IDN), ontbrekende schema's of ongebruikelijke tekens. De WHATWG-parser converteert IDN-hostnamen automatisch naar Punycode, terwijl strikte RFC 3986-parsers ze mogelijk afwijzen. Als u een URL in dit hulpmiddel plakt en andere resultaten ziet dan uw server-side code produceert, is het WHATWG-versus-RFC-verschil de meest waarschijnlijke oorzaak.

Codevoorbeelden

Elke grote programmeertaal heeft een ingebouwde URL-parser. De onderstaande voorbeelden parsen dezelfde URL en extraheren de onderdelen. Let op de kleine naamverschillen: Python gebruikt scheme in plaats van protocol, en Go stelt RawQuery beschikbaar in plaats van 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"

Veelgestelde vragen

Wat is het verschil tussen een URL en een URI?
Een URL (Uniform Resource Locator) is een specifiek type URI (Uniform Resource Identifier) dat zowel de identificator als het toegangsmechanisme bevat (het schema, zoals https://). Alle URL's zijn URI's, maar niet alle URI's zijn URL's. Een URN zoals urn:isbn:0451450523 is een URI die een bron identificeert bij naam, zonder op te geven hoe die opgehaald moet worden. In webontwikkeling worden de termen vaak door elkaar gebruikt, omdat vrijwel elke URI die u tegenkomt een URL is.
Hoe gaat de URL-constructor om met relatieve URL's?
De JavaScript URL-constructor vereist een basis-URL bij het parsen van relatieve paden. Het aanroepen van new URL('/pad?q=1') gooit een TypeError. U moet een basis opgeven: new URL('/pad?q=1', 'https://example.com'). Pythons urljoin en Go's url.ResolveReference dienen hetzelfde doel. Dit hulpmiddel verwacht volledige, absolute URL's met een schema.
Wat gebeurt er als een URL geen poortnummer heeft?
Wanneer de poort wordt weggelaten, geeft de parser een lege tekenreeks terug voor de poorteigenschap. De browser gebruikt de standaardpoort voor het schema: 443 voor https, 80 voor http, 21 voor ftp. U kunt de effectieve poort opvragen via de origin- of host-eigenschap, maar het poortveld zelf blijft leeg omdat er geen expliciete poort is opgegeven.
Kan een URL Unicode-tekens bevatten?
Ja, maar ze moeten worden gecodeerd voor verzending. De WHATWG URL-standaard doet dit automatisch: internationale domeinnamen worden omgezet naar Punycode (xn---voorvoegsel), en pad- en querytekens buiten het ASCII-bereik worden percent-gecodeerd. Als u een URL met Unicode in dit hulpmiddel plakt, ziet u de genormaliseerde, ASCII-veilige versie in de geparseerde uitvoer.
Wat is de maximale lengte van een URL?
Geen enkele standaard definieert een maximale URL-lengte — RFC 3986 zwijgt hierover. In de praktijk leggen browsers limieten op: Chrome ondersteunt tot ongeveer 2 MB in de adresbalk, terwijl Internet Explorer (verouderd) een limiet van 2.083 tekens had. De meeste webservers hanteren standaard 8 KB (Nginx) of 8 KB (Apache) voor de aanvraagregel. Als u grote hoeveelheden gegevens wilt doorgeven, gebruik dan POST-aanvragenteksten in plaats van querystrings.
Hoe parseer ik alleen de querystring zonder de volledige URL?
Gebruik in JavaScript new URLSearchParams('page=2&limit=10') om een losse querystring te parsen. Gebruik in Python urllib.parse.parse_qs('page=2&limit=10'). Beide geven de parameters terug als sleutel-waardeparen. Dit is handig wanneer u de querystring afzonderlijk hebt, bijvoorbeeld uit een formulierinzending of een logvermelding die alleen het querydeel heeft vastgelegd.
Is URL-parsing hetzelfde als URL-decodering?
Nee. URL-parsing splitst een URL op in structurele onderdelen (schema, host, pad, query, fragment). URL-decodering converteert percent-gecodeerde tekens terug naar hun oorspronkelijke vorm (%20 wordt een spatie, %26 wordt &). De twee bewerkingen zijn complementair: u parseert de URL doorgaans eerst en decodeert vervolgens afzonderlijke onderdelen. Decoderen vóór het parsen kan de URL-structuur beschadigen, omdat gedecodeerde scheidingstekens zoals & en = verkeerd zouden worden geïnterpreteerd.