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-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