Passa al contenuto principale

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:

  • http
  • https
  • ftp
  • mailto
  • file
  • data
  • tel

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@host
  • user: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:

  1. Elaborazione lato client: Gli identificatori di frammento sono elaborati dal client e non vengono inviati al server
  2. Navigazione nel documento: Comunemente utilizzato per ancore nei documenti HTML
  3. 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​

ComponentePrefissoRichiestoEsempioDescrizione
scheme-SìhttpProtocollo/schema
authority//Nouser@host:portInformazioni di autorità
path-Sì*/path/to/resourcePercorso risorsa
query?Nokey=valueParametri di query
fragment#Nosection1Identificatore 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
ComponenteValore
schemehttps
userinfouser:pass
hostwww.example.com
port8080
path/path/to/page
querykey=value
fragmentsection

Esempio 2: URI Mailto​

mailto:[email protected]?subject=Hello
ComponenteValore
schememailto
path[email protected]
querysubject=Hello

Esempio 3: URI File​

file:///home/user/document.txt
ComponenteValore
schemefile
authority(vuoto)
path/home/user/document.txt

Regole di codifica dei componenti​

Diversi componenti consentono diversi set di caratteri:

ComponenteCaratteri speciali consentitiDeve essere codificato
scheme+ - .Tutti gli altri
userinfo: ! $ & ' ( ) * + , ; =Tutti gli altri
host- . _ (reg-name)Tutti gli altri
port0-9Tutti 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