Un generico indirizzo che appare nella barra del browser viene, con abuso di linguaggio, chiamato URL. Ad essere precisi, le specifiche standard distinguono tra URL (Uniform Resource Locator), URI (Uniform Resource Identifier) e URN (Uniform Resource Name). Un esempio dovrebbe chiarire la differenza tra queste sigle

https://www.aziendeitalia.com/pagina.html

in questo caso, esemplificando, possiamo pensare alla prima parte dell'indirizzo come l'URL (https://www.aziendeitalia.com), alla seconda parte come l'URN (pagina.html) e all'insieme delle due (l'intero indirizzo) come all'URI. Abbiamo detto “esemplificando” per evitare di entrare nei dettagli, altrimenti le differenze tra URI e URL diventerebbero piuttosto sfumate, rischiando di fare confusione. Per quello che ci interessa possiamo benissimo pensare all'URL come all'indirizzo comune di un gruppo di risorse, per certi versi analogo al concetto di cartella o directory, mentre l'URN assomiglia al concetto di nome di un file o di un documento. Ecco perché servono entrambi (URL e URN) per definire un URI, che può essere pensato come il percorso completo (cartella più nome del file) di una generica risorsa sul web.

L'esempio appena visto dovrebbe spiegare perché è diffusa la pratica di considerare sinonimi URI e URL: da un punto di vista pratico un URL è anche un URI, perché di fatto rappresenta il nome completo di una risorsa. Se scrivessimo infatti

https://www.aziendeitalia.com

potremmo pensare di avere scritto solamente un URL, e non un URI, perché manca il nome della pagina (cioè l'URN). In realtà, siccome l'indirizzo qui sopra identifica comunque una risorsa, che in questo caso è la pagina di benvenuto di AziendeItalia, è lecito parlare di URI.

Encoding degli indirizzi

Dopo aver chiarito le (sottili) differenze tra URL e URI, possiamo affrontare la questione che ci interessa: l'encoding degli indirizzi. Consideriamo gli indirizzi

http://prova.com/domanda/pagina?n=5

http://prova.com/?/pagina?n=5

il primo caso è semplice: si tratta di una richiesta HTTP GET inviata alla risorsa domanda/pagina, passando il parametro n, con valore 5. Nel secondo caso stiamo immaginando che l'ipotetico sviluppatore del sito prova.com abbia pensato di abbreviare l'indirizzo, usando il simbolo “?” al posto della stringa domanda.

Si tratta ovviamente di una pessima idea, ed il motivo dovrebbe essere chiaro: come può il server, al momento di ricezione della richiesta, capire che non stiamo passando un parametro di nome /pagina?n con valore 5? In altre parole, la seconda richiesta potrebbe essere interpretata come: “voglio invocare l'indirizzo http://prova.com/ passando il parametro /pagina?n, e assegnando il valore 5 a questo parametro.”

Per evitare ambiguità di questo tipo si è ricorsi all'encoding di alcuni caratteri riservati. Ciò significa che all'interno di un URL o di un URI non è possibile usare liberamente tutti i caratteri, ma dobbiamo ricordarci che alcuni caratteri hanno un significato speciale. Alcuni di questi caratteri sono

! * ' ( ) ; : @ & = + $ , / ? # [ ]

procedere con la codifica (encoding) di questi caratteri significa rappresentarli in modo alternativo, in questo caso usando il loro codice ASCII preceduto dal carattere % (percentuale). In questo modo l'indirizzo ambiguo scritto sopra potrebbe diventare

http://prova.com/?%2Fpagina%3Fn=5

questo perché, nella codifica convenzionalmente accettata degli URL, il carattere riservato / (slash) diventa %2F, mentre il carattere riservato ? (punto di domanda) diventa %3F.

Un'ottima domanda, a questo punto, potrebbe essere: quando dobbiamo utilizzare l'encoding di un URL o di un URI? La risposta è: quando vogliamo usare un carattere riservato per uno scopo particolare, attribuendogli un significato speciale. Questo è esattamente quello che abbiamo fatto sopra: siccome volevano usare i caratteri / e ? come parte del nome della risorsa (/pagina?n), abbiamo dovuto codificare i caratteri per evitare ambiguità.

Il problema inverso

L'encoding degli URL risolve i problemi di ambiguità, e ci permette di usare tutti i caratteri liberamente, anche quelli riservati, previa la loro codifica. Esiste però un possibile problema: in alcuni casi un indirizzo viene codificato per altri motivi (ad esempio per essere scritto in un database), e quando viene proposto come link potrebbe avere una forma del genere

http://prova.com/pagina.php%3Fn%3D5

se copiamo l'iindirizzo qui sopra nella barra del browser, probabilmente non raggiungeremo alcuna pagina. L'indirizzo corretto, in questo caso, potrebbe essere quello decodificato

http://prova.com/pagina.php?n=5

un modo semplice e veloce di decodificare l'indirizzo potrebbe essere quello di usare l'apposita funzione JavaScript, ovvero

unescape(“http://prova.com/pagina.php%3Fn%3D5”);

che fornisce come risultato

http://prova.com/pagina.php?n=5

Ovviamente JavaScript fornisce anche la funzone escape(), che permette di codificare una generica stringa. Ricordiamoci di queste due funzioni tutte le volte che dobbiamo maneggiare un URL o un URI, perché sono spesso il modo più semplice di gestire qualsiasi esigenza di codifica.