Strumenti per sviluppatori · URL codificatore e decodificatore
Anatomia di un URL: spiegazione di schema, autorità, percorso, query e frammento
· Sfondo
struttura dell'URL standard web strumenti per sviluppatori
Ogni decisione sulla codifica percentuale dipende da quale parte di URL si trova un carattere. Questo post nomina i cinque componenti di RFC 3986, mostra cosa significa ciascun delimitatore e perché il frammento non raggiunge mai il server.
Perché lo stesso # va bene in un posto e distrugge un collegamento in un altro: una domanda su un componente, non una domanda sul personaggio
Un carattere cancelletto (#) in URL significa cose completamente diverse a seconda di dove appare. All'interno di un valore di stringa di query come ?search=C%23sharp, deve essere codificato in %23 per essere sicuro. Alla fine di un URL come https://example.com/page#section, segna il delimitatore del frammento e tutto ciò che segue è un frammento. Un personaggio, due contesti, due significati diversi. Questo è il motivo per cui le decisioni sulla codifica dipendono dal sapere con quale parte di URL stai lavorando.
Anche il punto interrogativo (?) ha una doppia natura. All'interno di un percorso o di un valore di query, deve essere codificato come %3F per essere visualizzato come dati. Come carattere letterale tra il percorso e la stringa di query, è una sintassi strutturale. Comprendere questi cinque componenti (schema, autorità, percorso, query e frammento) è il fondamento della corretta gestione di URL.
I cinque componenti: schema, autorità, percorso, query, frammento – e i delimitatori che li separano
RFC 3986 definisce formalmente gli URL come aventi cinque componenti: schema, autorità, percorso, query e frammento, separati da delimitatori specifici. Lo schema viene prima, seguito da ://, poi l'autorità, poi /, poi il percorso, poi ?, poi la query, poi #, poi il frammento. Non tutti i componenti vengono visualizzati in ogni URL. Un URL minimo potrebbe avere solo schema e percorso, come "mailto:user@example.com". Un URL completo li include tutti e cinque.
Ogni componente ha le proprie regole di sintassi. I due punti sono riservati nello schema, la barra nel percorso, la e commerciale nella query. I caratteri riservati devono essere codificati quando vengono visualizzati come dati: la barra nei valori del percorso diventa %2F.
All'interno dell'autorità: informazioni utente, host e porta e perché @ e : sono riservati lì
Il componente autorità contiene l'indirizzo di rete della risorsa: nome utente, password, nome host e porta. Il formato è [infoutente@]host[:porta]. Userinfo e host sono separati da @; host e porta sono separati da :. Questi caratteri @ e : sono riservati all'interno dell'autorità per delimitare questi sottocomponenti. Se hai un nome utente contenente un simbolo @, deve essere codificato in percentuale prima di concatenarlo. Ad esempio, "user@email.com:password" come nome utente diventerebbe "user%40email.com:password" prima della @ finale.
Il nome host può essere un dominio registrato come example.com, un indirizzo IP in decimale puntato come 192.0.2.1 o un indirizzo IPv6 racchiuso tra parentesi come [::1]. Il porto è facoltativo; se omesso, lo schema determina il valore predefinito (80 per http, 443 per https, ecc.). La parte userinfo viene utilizzata raramente negli URL moderni ma rimane parte della sintassi.
Segmenti di percorso e significato di / — struttura gerarchica e risoluzione dei segmenti di punto
Il percorso è una sequenza di segmenti separati da barre. Il percorso /a/b/c ha tre segmenti: a, b e c. Ogni segmento può contenere caratteri non riservati, caratteri con codifica percentuale o determinati caratteri riservati che sono sicuri in questo contesto. Una barra all'interno di un segmento deve essere codificata come %2F per evitare confusione con i separatori di segmento. Il percorso è gerarchico; implica che a sia una posizione, quindi a/b è più specifico.
I percorsi supportano anche segmenti di punti speciali: un singolo punto (.) significa "directory corrente" e due punti (..) significano "directory principale". Un percorso come ../../etc/passwd si risolve verso l'alto. Gli URL moderni e HTTP evitano di utilizzarli, ma esistono nella sintassi. Un segmento di percorso contenente un punto letterale o un doppio punto deve essere codificato in percentuale se il significato letterale del punto non è previsto.
Query e frammento: convenzioni sui valori-chiave e perché il frammento rimane nel browser
La stringa di query segue il percorso e inizia con ?. Si tratta tradizionalmente di una serie di coppie chiave=valore separate da &, sebbene la sintassi in realtà non sia strutturata: in una query può entrare qualsiasi cosa. Se hai un valore contenente & o =, tali caratteri devono essere codificati in percentuale in modo che non vengano scambiati per delimitatori. La query viene inviata al server; il server decide cosa farne.
Il frammento segue la query e inizia con #. Tutto ciò che segue # è un frammento e non raggiunge mai il server. Il browser gestisce il frammento localmente, solitamente per passare a un'ancora denominata o per indicare lo stato all'interno di un'applicazione a pagina singola. Poiché il frammento non raggiunge mai il server, si considera che un URL con un frammento diverso punti alla stessa risorsa.
Esempio pratico: sezionare un lungo mondo reale URL — etichettare ogni componente e ogni delimitatore
Prendi il URL "https://user:pass@example.com:8080/path/to/page?search=hello&sort=date#results". Lo schema è https. L'autorità è user:pass@example.com:8080, divisa in userinfo (user:pass), host (example.com) e porta (8080). Il percorso è /path/to/page, con segmenti di percorso, a e pagina. La query è search=hello&sort=date, contenente due parametri. Il frammento è results. Inserisci questo URL nel codificatore e decodificatore URL per vedere come lo strumento etichetta e codifica ciascun componente.
Se la ricerca contiene &, come ?search=R&D, diventa ?search=R%26D se codificato correttamente. I caratteri codificati in percentuale non creano confini visivi nel testo, quindi un'attenta codifica e decodifica è assolutamente essenziale per un'analisi corretta.
Cosa non copre — risoluzione di riferimento relativa e regimi speciali come mailto: e dati:
Riferimenti relativi come "../page" o "?query=value" sono validi all'interno di HTML e interpretati rispetto al documento corrente, ma hanno regole di risoluzione separate. Schemi speciali come mailto:, data: e file: seguono regole completamente diverse e non sono URL assoluti standard.
Questo post si concentra solo sulla struttura standard assoluta URL dimostrata dall'ispettore. I riferimenti relativi necessitano di una base URL prima che i loro componenti possano essere interpretati, mentre schemi come mailto e data non condividono la stessa forma di autorità e percorso. Mantenere questi casi separati impedisce che una regola appresa da un indirizzo HTTPS venga applicata ciecamente alla sintassi con delimitatori, passaggi di risoluzione o comportamento di trasporto diversi.
Conclusione: conoscere il componente prima di codificare: come le modalità a valore singolo e a indirizzo intero del codificatore e decodificatore URL si mappano su questa struttura
Il componente che stai codificando determina quali caratteri necessitano di escape e quali sono sicuri. Una barra è la sintassi letterale nel percorso, quindi una barra in un valore deve essere %2F. Nelle query, & e = devono essere codificati se compaiono nei valori. Il codificatore e decodificatore URL ha due modalità: "componente" per codificare un singolo valore e "indirizzo intero" per un URL completo. Utilizza la modalità componente durante la creazione di URL concatenando parti; utilizza la modalità indirizzo intero per verificare un URL esistente.
Conoscere i cinque componenti e i relativi delimitatori ti consente di scegliere correttamente ogni volta che incontri un'attività di codifica.