ToolDeck

URL Parser

Eine URL in ihre Bestandteile zerlegen — Protokoll, Host, Pfad, Query-Parameter, Hash

Beispiel ausprobieren

Was ist URL-Parsing?

URL-Parsing ist der Vorgang, einen Uniform Resource Locator in seine einzelnen Bestandteile zu zerlegen: Protokoll (Schema), Hostname, Port, Pfadname, Query-Parameter und Fragment-Bezeichner. Jede URL folgt einer Struktur, die durch RFC 3986 und den WHATWG URL Standard definiert ist. Ein URL-Parser liest die rohe Zeichenkette, identifiziert jedes Segment anhand seiner Trennzeichen (://, :, /, ?, #, &, =) und gibt sie als separate, zugängliche Felder zurück.

Browser führen URL-Parsing jedes Mal durch, wenn du eine Adresse eingibst oder auf einen Link klickst. Der JavaScript-URL-Konstruktor, das Python-Modul urllib.parse und das Go-Paket net/url implementieren alle Parser, die denselben strukturellen Regeln folgen. Eine URL zu parsen ist das Gegenteil von URL-Encoding: Statt Zeichen für den sicheren Transport zu transformieren, zerlegst du eine bereits gebildete URL in ihre Bestandteile.

Eine typische URL wie https://api.example.com:8080/v1/users?page=2&limit=10#section enthält sechs verschiedene Komponenten. Die Trennzeichen – ://, :, /, ?, &, =, und # – machen das Parsing deterministisch: Jedes signalisiert eine Grenze und ermöglicht es einem Parser, Felder ohne Mehrdeutigkeit zu extrahieren.

Warum einen Online-URL-Parser verwenden?

Eine URL manuell mit dem Auge aufzuteilen ist fehleranfällig, besonders wenn die Zeichenkette encodierte Zeichen, mehrere Query-Parameter oder nicht-standardmäßige Ports enthält. Dieses Tool parst die URL mit demselben WHATWG-konformen Algorithmus, den Browser verwenden, und zeigt jede Komponente in einer übersichtlichen, kopierbaren Tabelle an.

Sofort im Browser parsen
Füge eine beliebige URL ein und sieh alle Komponenten sofort aufgeschlüsselt. Kein Neuladen der Seite, kein Server-Aufruf, kein Warten.
🔒
URLs privat halten
Das Parsing läuft vollständig im Browser über die native URL-API. Die eingegebene URL verlässt nie deinen Rechner.
🔍
Jedes Detail einsehen
Sieh Protokoll, Hostname, Port, Pfadname, Query-String, Hash und jeden einzelnen Query-Parameter mit seinem decodierten Wert.
📋
Einzelne Komponenten kopieren
Klicke auf die Kopierschaltfläche neben einem Feld, um den genauen Wert zu übernehmen. Kein manuelles Auswählen und Kürzen von Teilstrings nötig.

Anwendungsfälle für den URL-Parser

Frontend-Routing debuggen
Prüfe, ob Pfadsegmente und Hash-Fragmente mit deiner Router-Konfiguration übereinstimmen. Erkenne fehlplatzierte Schrägstriche oder unerwartete Query-Parameter, bevor sie 404-Fehler verursachen.
Backend-API-Endpunkte validieren
Überprüfe, ob eingehende Request-URLs den korrekten Hostname, Port und Pfadaufbau enthalten, bevor du Route-Handler oder Middleware schreibst.
DevOps-Redirect-Regeln testen
Beim Schreiben von Nginx-, Apache- oder CDN-Redirect-Regeln kannst du die ursprünglichen und Ziel-URLs parsen, um zu bestätigen, dass jede Komponente korrekt abgebildet wird.
QA-Link-Verifizierung
Parse URLs aus Testberichten oder Bug-Tickets, um zu isolieren, welcher Query-Parameter oder welches Fragment die falsche Seite lädt.
URL-Extraktion in Datenpipelines
Extrahiere Hostnamen oder Pfadsegmente aus URLs in Log-Dateien oder Analysedaten, um Berichte auf Domain-Ebene zu erstellen oder Traffic nach Endpunkt zu filtern.
URL-Struktur verstehen lernen
Studenten und Entwickler, die neu in Web-Protokollen sind, können echte URLs einfügen und sofort sehen, welches Trennzeichen welche Grenze markiert.

URL-Komponentenreferenz

Die folgende Tabelle zeigt jede Property, die der JavaScript-URL-Konstruktor beim Parsen einer URL zurückgibt. Dieselben Komponenten existieren in Pythons urlparse-Ergebnis, Gos url.URL-Struct und PHPs parse_url-Ausgabe, obwohl sich die Property-Namen zwischen den Sprachen unterscheiden.

PropertyBeispielBeschreibung
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 Standard vs. RFC 3986

Zwei Spezifikationen definieren, wie URLs geparst werden sollen. Sie stimmen in der Grundstruktur überein, weichen aber in Randfällen voneinander ab – und diese Abweichung ist meist der Grund, wenn dein Browser eine URL anders behandelt als dein Server.

WHATWG URL Standard
Wird von allen modernen Browsern und dem JavaScript-URL-Konstruktor verwendet. Akzeptiert und normalisiert unsaubere Eingaben: fehlende Schemas, Backslashes als Pfadtrennzeichen, nicht-ASCII-Hostnamen über Punycode. Als Living Standard unter url.spec.whatwg.org definiert.
RFC 3986
Die formale IETF-Spezifikation (2005). Strenger als WHATWG: lehnt einige Eingaben ab, die Browser akzeptieren. Wird von vielen serverseitigen Bibliotheken verwendet, darunter Gos net/url und Pythons urllib.parse. In RFC 3986 definiert.

In der Praxis treten die meisten Unterschiede beim Parsen von URLs mit internationalisierten Domainnamen (IDN), fehlenden Schemas oder ungewöhnlichen Zeichen auf. Der WHATWG-Parser konvertiert IDN-Hostnamen automatisch in Punycode, während strikte RFC 3986-Parser diese möglicherweise ablehnen. Wenn du eine URL in dieses Tool einfügst und andere Ergebnisse als dein serverseitiger Code liefert, ist der WHATWG-vs-RFC-Unterschied die wahrscheinlichste Ursache.

Code-Beispiele

Jede wichtige Programmiersprache hat einen eingebauten URL-Parser. Die folgenden Beispiele parsen dieselbe URL und extrahieren ihre Komponenten. Beachte die kleinen Namensunterschiede zwischen den Sprachen: Python verwendet scheme statt protocol, und Go stellt RawQuery statt search bereit.

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"

Häufig gestellte Fragen

Was ist der Unterschied zwischen einer URL und einer URI?
Eine URL (Uniform Resource Locator) ist ein spezifischer Typ einer URI (Uniform Resource Identifier), der sowohl den Bezeichner als auch den Zugriffsmechanismus (das Schema, z. B. https://) enthält. Alle URLs sind URIs, aber nicht alle URIs sind URLs. Ein URN wie urn:isbn:0451450523 ist eine URI, die eine Ressource über ihren Namen identifiziert, ohne anzugeben, wie sie abgerufen werden soll. In der Webentwicklung werden die Begriffe oft synonym verwendet, da fast jede URI, mit der man es zu tun hat, eine URL ist.
Wie geht der URL-Konstruktor mit relativen URLs um?
Der JavaScript-URL-Konstruktor erfordert eine Basis-URL beim Parsen relativer Pfade. Der Aufruf von new URL('/pfad?q=1') wirft einen TypeError. Du musst eine Basis angeben: new URL('/pfad?q=1', 'https://example.com'). Pythons urljoin und Gos url.ResolveReference dienen demselben Zweck. Dieses Tool erwartet vollständige, absolute URLs mit einem Schema.
Was passiert, wenn eine URL keine Portnummer hat?
Wenn der Port weggelassen wird, gibt der Parser einen leeren String für die port-Property zurück. Der Browser nimmt den Standardport für das Schema an: 443 für https, 80 für http, 21 für ftp. Du kannst auf den effektiven Port über die origin- oder host-Property zugreifen, aber das port-Feld bleibt leer, da kein expliziter Port angegeben wurde.
Kann eine URL Unicode-Zeichen enthalten?
Ja, aber sie müssen für die Übertragung encodiert sein. Der WHATWG URL Standard behandelt dies automatisch: Internationale Domainnamen werden in Punycode konvertiert (xn---Präfix), und Pfad-/Query-Zeichen außerhalb des ASCII-Bereichs werden percent-encoded. Wenn du eine URL mit Unicode in dieses Tool einfügst, siehst du die normalisierte, ASCII-sichere Version in der geparsten Ausgabe.
Was ist die maximale Länge einer URL?
Kein Standard definiert eine maximale URL-Länge – RFC 3986 schweigt zu diesem Thema. In der Praxis setzen Browser Grenzen: Chrome unterstützt in der Adressleiste bis zu ca. 2 MB, während Internet Explorer (Legacy) ein Limit von 2.083 Zeichen hatte. Die meisten Webserver haben standardmäßig 8 KB (Nginx) oder 8 KB (Apache) für die Request-Line. Wenn du große Daten übertragen musst, verwende POST-Request-Bodies statt Query-Strings.
Wie parse ich nur den Query-String ohne die vollständige URL?
In JavaScript verwende new URLSearchParams('page=2&limit=10'), um einen reinen Query-String zu parsen. In Python verwende urllib.parse.parse_qs('page=2&limit=10'). Beide geben die Parameter als Schlüssel-Wert-Paare zurück. Das ist nützlich, wenn du den Query-String isoliert vorliegen hast, z. B. aus einer Formularübermittlung oder einem Log-Eintrag, der nur den Query-Teil erfasst hat.
Ist URL-Parsing dasselbe wie URL-Decoding?
Nein. URL-Parsing zerlegt eine URL in strukturelle Komponenten (Schema, Host, Pfad, Query, Fragment). URL-Decoding konvertiert percent-encodierte Zeichen zurück in ihre ursprüngliche Form (%20 wird zu einem Leerzeichen, %26 wird zu &). Die beiden Operationen ergänzen sich: Normalerweise parsest du die URL zuerst und decodierst dann einzelne Komponentenwerte. Decoding vor dem Parsing kann die URL-Struktur beschädigen, da decodierte Trennzeichen wie & und = falsch interpretiert würden.