3. Componenti sintattici (Syntax Components)
La sintassi URI generica consiste in una sequenza gerarchica di componenti denominati schema (scheme), autorità (authority), percorso (path), query (query) e frammento (fragment).
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
Esempio di struttura dei componenti:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
Le seguenti sezioni forniscono descrizioni dettagliate di ciascun componente.
3.1. Schema (Scheme)
Ogni URI inizia con un nome di schema che fa riferimento a una specifica per l'assegnazione di identificatori all'interno di quello schema. I nomi di schema consistono in una sequenza di caratteri che inizia con una lettera e seguita da qualsiasi combinazione di lettere, cifre, più ("+"), punto (".") o trattino ("-").
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
Esempi:
httphttpsftpmailtofiledatatel
I nomi di schema sono indipendenti da maiuscole/minuscole. La forma canonica è minuscola, e i normalizzatori dovrebbero (SHOULD) convertire i nomi di schema in minuscolo.
Nota: Sebbene gli schemi siano indipendenti da maiuscole/minuscole, i produttori e i normalizzatori dovrebbero usare lettere minuscole.
3.2. Autorità (Authority)
Il componente autorità consiste in un sottocomponente di informazioni utente opzionale, un sottocomponente host e un sottocomponente porta opzionale, preceduto da due barre ("/").
authority = [ userinfo "@" ] host [ ":" port ]
Esempio completo:
user:[email protected]:8080
\__________/ \______________/ \__/
userinfo host port
3.2.1. Informazioni utente (User Information)
Il sottocomponente userinfo può consistere in un nome utente e, facoltativamente, informazioni specifiche dello schema su come ottenere l'autorizzazione per accedere alla risorsa.
userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
Esempi:
user@hostuser:password@host(deprecato, rischio di sicurezza)anonymous@host
Avviso di sicurezza: L'inclusione di password negli URI è deprecata perché le password possono essere esposte nei log, nella cronologia, ecc.
3.2.2. Host (Host)
Il sottocomponente host può essere un nome registrato (incluso ma non limitato a un nome host) o un indirizzo IP. Gli indirizzi IPv6 devono (MUST) essere racchiusi tra parentesi quadre.
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
reg-name = *( unreserved / pct-encoded / sub-delims )
Esempi di tipi di host:
1. Nome registrato
www.example.com
example.org
localhost
2. Indirizzo IPv4
192.0.2.1
127.0.0.1
3. Indirizzo IPv6
[2001:db8::1]
[::1]
[fe80::1]
4. Versione IP futura
[v9.abc:def]
Normalizzazione dell'host: I nomi host sono indipendenti da maiuscole/minuscole e dovrebbero (SHOULD) essere normalizzati in minuscolo.
3.2.3. Porta (Port)
Il sottocomponente porta è opzionale e rappresentato in cifre decimali.
port = *DIGIT
Esempi:
http://example.com:80/(porta predefinita HTTP)https://example.com:443/(porta predefinita HTTPS)http://example.com:8080/(porta personalizzata)
Porta predefinita: Se la porta è vuota o non specificata, si presume che sia la porta predefinita per lo schema.
3.3. Percorso (Path)
Il componente percorso contiene dati che, insieme ai dati nel componente query, servono a identificare una risorsa nell'ambito dello schema URI e dell'autorità di denominazione. Il percorso è composto da una sequenza di segmenti di percorso separati da un carattere barra ("/").
path = path-abempty ; inizia con "/" o è vuoto
/ path-absolute ; inizia con "/" ma non "//"
/ path-noscheme ; inizia con segmento senza due punti
/ path-rootless ; inizia con un segmento
/ path-empty ; zero caratteri
path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty = 0<pchar>
segment = *pchar
segment-nz = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
Esempi di tipi di percorso:
1. Percorso assoluto
/path/to/resource
/index.html
/
2. Percorso relativo
path/to/resource
../parent/resource
resource
3. Percorso vuoto
http://example.com
Segmenti di percorso: Un percorso consiste in segmenti separati da barre. I segmenti speciali includono:
.(directory corrente)..(directory genitore)
3.4. Query (Query)
Il componente query contiene dati non gerarchici che, insieme ai dati nel componente percorso, servono a identificare una risorsa. Il componente query è indicato da un punto interrogativo ("?").
query = *( pchar / "/" / "?" )
Esempi di stringa di query:
?key=value
?name=John&age=30
?search=hello+world
?filter[]=a&filter[]=b
?q=%E4%BD%A0%E5%A5%BD
Formato comune: Sebbene la specifica URI non definisca il formato della stringa di query, il formato di coppie key=value separate da & è diventato uno standard de facto:
?key1=value1&key2=value2&key3=value3
3.5. Frammento (Fragment)
Il componente frammento consente l'identificazione indiretta di una risorsa secondaria all'interno di una rappresentazione della risorsa identificata dall'URI. L'identificatore di frammento è indicato da un cancelletto ("#").
fragment = *( pchar / "/" / "?" )
Esempi di frammento:
#section1
#top
#chapter-3
#line-42
Caratteristiche importanti:
- Elaborazione lato client: Gli identificatori di frammento sono elaborati dal client e non vengono inviati al server
- Navigazione nel documento: Comunemente utilizzato per ancore nei documenti HTML
- Risorsa secondaria: Identifica una parte della risorsa primaria
Esempio:
http://example.com/page.html#section2
- Il server riceve:
http://example.com/page.html - Il client naviga a:
#section2
Riepilogo dei componenti URI
| Componente | Prefisso | Richiesto | Esempio | Descrizione |
|---|---|---|---|---|
| scheme | - | Sì | http | Protocollo/schema |
| authority | // | No | user@host:port | Informazioni di autorità |
| path | - | Sì* | /path/to/resource | Percorso risorsa |
| query | ? | No | key=value | Parametri di query |
| fragment | # | No | section1 | Identificatore di frammento |
*Il percorso può essere vuoto
Scomposizione di esempi URI completi
Esempio 1: URL HTTP
https://user:[email protected]:8080/path/to/page?key=value#section
| Componente | Valore |
|---|---|
| scheme | https |
| userinfo | user:pass |
| host | www.example.com |
| port | 8080 |
| path | /path/to/page |
| query | key=value |
| fragment | section |
Esempio 2: URI Mailto
mailto:[email protected]?subject=Hello
| Componente | Valore |
|---|---|
| scheme | mailto |
| path | [email protected] |
| query | subject=Hello |
Esempio 3: URI File
file:///home/user/document.txt
| Componente | Valore |
|---|---|
| scheme | file |
| authority | (vuoto) |
| path | /home/user/document.txt |
Regole di codifica dei componenti
Diversi componenti consentono diversi set di caratteri:
| Componente | Caratteri speciali consentiti | Deve essere codificato |
|---|---|---|
| scheme | + - . | Tutti gli altri |
| userinfo | : ! $ & ' ( ) * + , ; = | Tutti gli altri |
| host | - . _ (reg-name) | Tutti gli altri |
| port | 0-9 | Tutti gli altri |
| path | : @ ! $ & ' ( ) * + , ; = | Tutti gli altri |
| query | : @ / ? ! $ & ' ( ) * + , ; = | Tutti gli altri |
| fragment | : @ / ? ! $ & ' ( ) * + , ; = | Tutti gli altri |
Capitolo successivo: 4. Riferimento URI (URI Reference) - Riferimenti URI e riferimenti relativi