Parse any URL into protocol, host, port, path, query and fragment using the WHATWG URL standard. Query parameters are decoded into a readable table.
Split a URL into every component the browser sees. Paste a URL and each part is extracted using the same WHATWG parser your browser uses, so the result matches exactly how the URL will actually be interpreted. Query parameters are decoded into a table.
Most URLs use only a handful of those slots, but the grammar always allows all of them. Reading a URL is largely a matter of knowing where one component stops and the next begins, which is decided by the delimiters ://, @, :, /, ? and #.
Component by component
Protocol (scheme) identifies how to fetch the resource — https:, mailto:, ftp:. Note that the WHATWG parser includes the trailing colon in this value, which surprises people comparing it against the string "https".
Username and password are the deprecated userinfo section. Browsers still parse them but strip them from requests and often warn, because embedding credentials in a URL leaks them into history, logs and referrer headers. Treat their presence in a URL you did not write as a phishing signal.
Hostname is the domain or IP address alone. Host is the hostname plus the port when a non-default port is present, which is why the two fields here often look identical.
Port is empty when the URL uses the scheme's default — 443 for https, 80 for http. The parser normalises this: example.com:443/ reports an empty port because 443 adds no information.
Path is everything from the first / up to the query. It is the only component that is never empty for an http(s) URL; a bare origin gets a path of /.
Query string starts at ? and carries the parameters. Fragment starts at # and is the only part never sent to the server — it is handled purely client-side, which is why single-page apps once used it for routing and why an access token in a fragment stays out of server logs.
Origin is the security-relevant triple of scheme, host and port. Two URLs share an origin only when all three match, and that is exactly what the same-origin policy and CORS decisions are based on.
Why the parser is strict
The WHATWG URL parser only accepts absolute URLs. example.com/page has no scheme, so it cannot be parsed on its own — the parser has no way to know whether you meant example.com/page or a relative path. Real code resolves relative references against a base URL; this tool deliberately requires the absolute form so that what you see is unambiguous.
Normalisation you will notice
The parser does not hand back the raw string. It lowercases the scheme and host, resolves . and .. segments in the path, drops default ports, and converts internationalised domain names to their Punycode form, so münchen.de reports a hostname of xn--mnchen-3ya.de. This is a feature: it shows you the URL as the network stack will actually treat it, not as it was typed.
Repeated parameters
A query string may legitimately repeat a key, as in ?tag=a&tag=b. There is no specification saying what that means — some frameworks take the first value, some the last, some collect an array. The table here lists every occurrence in order so you can see exactly what was sent rather than a collapsed view.
FAQs
Why is the port field empty?
Because the URL uses the default port for its scheme. The WHATWG parser omits 443 for https and 80 for http, since including them adds no information and would break origin comparisons.
Why does the protocol include a colon?
That is what the URL standard defines. The protocol property is 'https:' rather than 'https'. If you compare against a bare scheme name, remember to account for the trailing colon.
What is the difference between host and hostname?
Hostname is the domain alone. Host includes the port if one is present. For https://example.com:8443/ the hostname is example.com and the host is example.com:8443.
Why can't I parse a relative URL?
A relative reference such as /about or ../img.png only has meaning against a base URL. The parser requires an absolute URL with a scheme so the result is unambiguous.
Is the fragment sent to the server?
No. The part after # is never transmitted in an HTTP request. It is resolved entirely in the browser, which is why OAuth implicit flows used it to keep tokens out of server logs.
Why did my Unicode domain change?
Internationalised domain names are converted to Punycode, the ASCII form actually used by DNS. münchen.de becomes xn--mnchen-3ya.de. This is the same transformation your browser performs before making the request.