ToolDeck

Analizzatore URL

Analizza un URL nei suoi componenti — protocollo, host, percorso, parametri query, hash

Prova un esempio

Cos'è il parsing degli URL?

Il parsing degli URL è il processo di scomposizione di un Uniform Resource Locator nelle sue componenti individuali: protocollo (schema), hostname, porta, percorso, parametri query e identificatore di frammento. Ogni URL segue una struttura definita da RFC 3986 e dallo WHATWG URL Standard. Un parser URL legge la stringa grezza, identifica ogni segmento tramite i suoi caratteri delimitatori (://, :, /, ?, #, &, =) e restituisce ciascuno come campo separato e accessibile.

I browser eseguono il parsing degli URL ogni volta che digiti un indirizzo o clicchi su un link. Il costruttore JavaScript URL, il modulo urllib.parse di Python e il pacchetto net/url di Go implementano tutti parser che seguono le stesse regole strutturali. Analizzare un URL è l'operazione inversa della codifica URL: invece di trasformare i caratteri per un trasporto sicuro, si scompone un URL già formato nelle parti che lo compongono.

Un URL tipico come https://api.example.com:8080/v1/users?page=2&limit=10#section contiene sei componenti distinte. I caratteri delimitatori — ://, :, /, ?, &, =, e # — rendono il parsing deterministico: ognuno segnala un confine e permette al parser di estrarre i campi senza ambiguità.

Perché usare un analizzatore URL online?

Dividere manualmente un URL a occhio è soggetto a errori, specialmente quando la stringa contiene caratteri codificati, più parametri query o porte non standard. Questo strumento analizza l'URL utilizzando lo stesso algoritmo conforme a WHATWG usato dai browser e mostra ogni componente in una tabella chiara e copiabile.

Analisi immediata nel browser
Incolla qualsiasi URL e vedi tutte le componenti scomposte immediatamente. Nessun ricaricamento della pagina, nessuna chiamata al server, nessuna attesa.
🔒
I tuoi URL rimangono privati
Il parsing viene eseguito interamente nel tuo browser utilizzando la API URL nativa. L'URL che inserisci non lascia mai il tuo dispositivo.
🔍
Ispeziona ogni dettaglio
Visualizza protocollo, hostname, porta, percorso, query string, hash e ogni singolo parametro query con il suo valore decodificato.
📋
Copia le singole componenti
Clicca il pulsante di copia accanto a qualsiasi campo per ottenere il valore esatto. Nessuna necessità di selezionare e ritagliare manualmente le sottostringhe.

Casi d'uso dell'analizzatore URL

Debug del routing frontend
Verifica che i segmenti di percorso e i frammenti hash corrispondano alla configurazione del tuo router. Individua barre fuori posto o parametri query inattesi prima che causino errori 404.
Validazione degli endpoint API backend
Verifica che gli URL delle richieste in entrata contengano hostname, porta e struttura del percorso corretti prima di scrivere gestori di route o middleware.
Test delle regole di redirect DevOps
Quando scrivi regole di redirect per Nginx, Apache o CDN, analizza gli URL di origine e destinazione per confermare che ogni componente venga mappata correttamente.
Verifica dei link in QA
Analizza gli URL dai report di test o dai ticket di bug per isolare quale parametro query o frammento sta causando il caricamento della pagina sbagliata.
Estrazione di URL in pipeline di dati
Estrai hostname o segmenti di percorso dagli URL nei file di log o nei dati di analytics per costruire report a livello di dominio o filtrare il traffico per endpoint.
Apprendimento della struttura degli URL
Studenti e sviluppatori alle prime armi con i protocolli web possono incollare URL reali e vedere immediatamente quale delimitatore segna quale confine.

Riferimento alle componenti URL

La tabella seguente mostra ogni proprietà restituita dal costruttore JavaScript URL durante il parsing di un URL. Le stesse componenti esistono nel risultato di urlparse di Python, nella struct url.URL di Go e nell'output di parse_url di PHP, sebbene i nomi delle proprietà differiscano tra i linguaggi.

ProprietàEsempioDescrizione
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

Due specifiche definiscono come gli URL devono essere analizzati. Concordano sulla struttura di base ma divergono nei casi limite — e quella divergenza è solitamente la causa quando il browser gestisce un URL diversamente rispetto al tuo server.

WHATWG URL Standard
Usato da tutti i browser moderni e dal costruttore JavaScript URL. Accetta e normalizza input approssimativo: schemi mancanti, barre rovesciate come separatori di percorso, hostname internazionali tramite Punycode. Definito come standard vivente su url.spec.whatwg.org.
RFC 3986
La specifica IETF formale (2005). Più restrittiva di WHATWG: rifiuta alcuni input accettati dai browser. Usata da molte librerie lato server tra cui net/url di Go e urllib.parse di Python. Definita in RFC 3986.

In pratica, la maggior parte delle differenze emerge quando si analizzano URL con nomi di dominio internazionali (IDN), schemi mancanti o caratteri insoliti. Il parser WHATWG converte automaticamente gli hostname IDN in Punycode, mentre i parser RFC 3986 stretti possono rifiutarli. Se incolli un URL in questo strumento e ottieni risultati diversi rispetto al codice lato server, la differenza tra WHATWG e RFC è la causa più probabile.

Esempi di codice

Ogni linguaggio principale ha un parser URL integrato. Gli esempi seguenti analizzano lo stesso URL ed estraggono le sue componenti. Nota le piccole differenze nei nomi tra i linguaggi: Python usa scheme invece di protocol, e Go espone RawQuery invece di 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"

Domande frequenti

Qual è la differenza tra URL e URI?
Un URL (Uniform Resource Locator) è un tipo specifico di URI (Uniform Resource Identifier) che include sia l'identificatore che il meccanismo di accesso (lo schema, come https://). Tutti gli URL sono URI, ma non tutti gli URI sono URL. Un URN come urn:isbn:0451450523 è un URI che identifica una risorsa per nome senza specificare come recuperarla. Nello sviluppo web, i termini sono spesso usati in modo intercambiabile perché quasi ogni URI che incontri è un URL.
Come gestisce il costruttore URL gli URL relativi?
Il costruttore JavaScript URL richiede un URL base quando analizza percorsi relativi. Chiamare new URL('/path?q=1') genera un TypeError. È necessario fornire una base: new URL('/path?q=1', 'https://example.com'). urljoin di Python e url.ResolveReference di Go servono allo stesso scopo. Questo strumento si aspetta URL assoluti e completi con uno schema.
Cosa succede quando un URL non ha un numero di porta?
Quando la porta viene omessa, il parser restituisce una stringa vuota per la proprietà port. Il browser assume la porta predefinita per lo schema: 443 per https, 80 per http, 21 per ftp. È possibile accedere alla porta effettiva tramite la proprietà origin o host, ma il campo port rimane vuoto perché non è stata specificata alcuna porta esplicita.
Un URL può contenere caratteri Unicode?
Sì, ma devono essere codificati per la trasmissione. Lo WHATWG URL Standard gestisce questo automaticamente: i nomi di dominio internazionali vengono convertiti in Punycode (prefisso xn--), e i caratteri di percorso e query al di fuori dell'intervallo ASCII vengono codificati in percentuale. Se incolli un URL con Unicode in questo strumento, vedrai la versione normalizzata e sicura per ASCII nell'output analizzato.
Qual è la lunghezza massima di un URL?
Nessuno standard definisce una lunghezza massima per gli URL — RFC 3986 tace sull'argomento. In pratica, i browser applicano dei limiti: Chrome supporta fino a circa 2 MB nella barra degli indirizzi, mentre Internet Explorer (legacy) aveva un limite di 2.083 caratteri. La maggior parte dei web server ha un limite predefinito di 8 KB (Nginx) o 8 KB (Apache) per la riga della richiesta. Se devi trasmettere dati di grandi dimensioni, usa il corpo delle richieste POST invece delle query string.
Come analizzo solo la query string senza l'URL completo?
In JavaScript, usa new URLSearchParams('page=2&limit=10') per analizzare una query string isolata. In Python, usa urllib.parse.parse_qs('page=2&limit=10'). Entrambi restituiscono i parametri come coppie chiave-valore. Questo è utile quando hai la query string in modo isolato, ad esempio da un invio di modulo o da una voce di log che ha catturato solo la parte query.
Il parsing degli URL è uguale alla decodifica degli URL?
No. Il parsing degli URL divide un URL nelle sue componenti strutturali (schema, host, percorso, query, frammento). La decodifica degli URL converte i caratteri codificati in percentuale nella loro forma originale (%20 diventa uno spazio, %26 diventa &). Le due operazioni sono complementari: di solito si analizza l'URL prima, poi si decodificano i valori delle singole componenti. Decodificare prima del parsing può rompere la struttura dell'URL perché i delimitatori decodificati come & e = verrebbero interpretati erroneamente.