Aller au contenu principal

3. Composants syntaxiques (Syntax Components)

La syntaxe URI générique consiste en une séquence hiérarchique de composants appelés schéma (scheme), autorité (authority), chemin (path), requête (query) et fragment (fragment).

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty

Exemple de structure des composants:

  foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose

Les sections suivantes fournissent des descriptions détaillées de chaque composant.


3.1. Schéma (Scheme)

Chaque URI commence par un nom de schéma qui fait référence à une spécification pour l'attribution d'identificateurs au sein de ce schéma. Les noms de schéma consistent en une séquence de caractères commençant par une lettre et suivie de n'importe quelle combinaison de lettres, chiffres, plus ("+"), point (".") ou trait d'union ("-").

scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

Exemples:

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

Les noms de schéma sont insensibles à la casse. La forme canonique est en minuscules, et les normalisateurs devraient (SHOULD) convertir les noms de schéma en minuscules.

Note: Bien que les schémas soient insensibles à la casse, les producteurs et normalisateurs devraient utiliser des lettres minuscules.


3.2. Autorité (Authority)

Le composant autorité consiste en un sous-composant d'informations utilisateur optionnel, un sous-composant hôte, et un sous-composant port optionnel, précédé de deux barres obliques ("//").

authority = [ userinfo "@" ] host [ ":" port ]

Exemple complet:

user:[email protected]:8080
\__________/ \______________/ \__/
userinfo host port

3.2.1. Informations utilisateur (User Information)

Le sous-composant userinfo peut consister en un nom d'utilisateur et, optionnellement, des informations spécifiques au schéma sur la façon d'obtenir l'autorisation d'accéder à la ressource.

userinfo = *( unreserved / pct-encoded / sub-delims / ":" )

Exemples:

  • user@host
  • user:password@host (déprécié, risque de sécurité)
  • anonymous@host

Avertissement de sécurité: L'inclusion de mots de passe dans les URI est dépréciée car les mots de passe peuvent être exposés dans les journaux, l'historique, etc.


3.2.2. Hôte (Host)

Le sous-composant hôte peut être un nom enregistré (incluant mais non limité à un nom d'hôte) ou une adresse IP. Les adresses IPv6 doivent (MUST) être entourées de crochets.

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 )

Exemples de types d'hôte:

1. Nom enregistré

www.example.com
example.org
localhost

2. Adresse IPv4

192.0.2.1
127.0.0.1

3. Adresse IPv6

[2001:db8::1]
[::1]
[fe80::1]

4. Version IP future

[v9.abc:def]

Normalisation de l'hôte: Les noms d'hôte sont insensibles à la casse et devraient (SHOULD) être normalisés en minuscules.


3.2.3. Port (Port)

Le sous-composant port est optionnel et représenté en chiffres décimaux.

port = *DIGIT

Exemples:

  • http://example.com:80/ (port par défaut HTTP)
  • https://example.com:443/ (port par défaut HTTPS)
  • http://example.com:8080/ (port personnalisé)

Port par défaut: Si le port est vide ou non spécifié, il est supposé être le port par défaut du schéma.


3.3. Chemin (Path)

Le composant chemin contient des données qui, avec les données du composant requête, servent à identifier une ressource dans le cadre du schéma et de l'autorité de nommage de l'URI. Le chemin est composé d'une séquence de segments de chemin séparés par un caractère barre oblique ("/").

path          = path-abempty    ; commence par "/" ou est vide
/ path-absolute ; commence par "/" mais pas "//"
/ path-noscheme ; commence par un segment sans deux-points
/ path-rootless ; commence par un segment
/ path-empty ; zéro caractère

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 / ":" / "@"

Exemples de types de chemin:

1. Chemin absolu

/path/to/resource
/index.html
/

2. Chemin relatif

path/to/resource
../parent/resource
resource

3. Chemin vide

http://example.com

Segments de chemin: Un chemin consiste en segments séparés par des barres obliques. Les segments spéciaux incluent:

  • . (répertoire courant)
  • .. (répertoire parent)

3.4. Requête (Query)

Le composant requête contient des données non hiérarchiques qui, avec les données du composant chemin, servent à identifier une ressource. Le composant requête est indiqué par un point d'interrogation ("?").

query = *( pchar / "/" / "?" )

Exemples de chaîne de requête:

?key=value
?name=John&age=30
?search=hello+world
?filter[]=a&filter[]=b
?q=%E4%BD%A0%E5%A5%BD

Format courant: Bien que la spécification URI ne définisse pas le format de la chaîne de requête, le format de paires key=value séparées par & est devenu un standard de facto:

?key1=value1&key2=value2&key3=value3

3.5. Fragment (Fragment)

Le composant fragment permet l'identification indirecte d'une ressource secondaire dans une représentation de la ressource identifiée par l'URI. L'identificateur de fragment est indiqué par un signe dièse ("#").

fragment = *( pchar / "/" / "?" )

Exemples de fragment:

#section1
#top
#chapter-3
#line-42

Caractéristiques importantes:

  1. Traitement côté client: Les identificateurs de fragment sont traités par le client et ne sont pas envoyés au serveur
  2. Navigation dans le document: Couramment utilisé pour les ancres dans les documents HTML
  3. Ressource secondaire: Identifie une partie de la ressource primaire

Exemple:

http://example.com/page.html#section2
  • Le serveur reçoit: http://example.com/page.html
  • Le client navigue vers: #section2

Résumé des composants URI

ComposantPréfixeRequisExempleDescription
scheme-OuihttpProtocole/schéma
authority//Nonuser@host:portInformations d'autorité
path-Oui*/path/to/resourceChemin de ressource
query?Nonkey=valueParamètres de requête
fragment#Nonsection1Identificateur de fragment

*Le chemin peut être vide


Décomposition d'exemples d'URI complets

Exemple 1: URL HTTP

https://user:[email protected]:8080/path/to/page?key=value#section
ComposantValeur
schemehttps
userinfouser:pass
hostwww.example.com
port8080
path/path/to/page
querykey=value
fragmentsection

Exemple 2: URI Mailto

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

Exemple 3: URI File

file:///home/user/document.txt
ComposantValeur
schemefile
authority(vide)
path/home/user/document.txt

Règles d'encodage des composants

Différents composants autorisent différents jeux de caractères:

ComposantCaractères spéciaux autorisésDoit être encodé
scheme+ - .Tous les autres
userinfo: ! $ & ' ( ) * + , ; =Tous les autres
host- . _ (reg-name)Tous les autres
port0-9Tous les autres
path: @ ! $ & ' ( ) * + , ; =Tous les autres
query: @ / ? ! $ & ' ( ) * + , ; =Tous les autres
fragment: @ / ? ! $ & ' ( ) * + , ; =Tous les autres

Chapitre suivant: 4. Référence URI (URI Reference) - Références URI et références relatives