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:
httphttpsftpmailtofiledatatel
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@hostuser: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:
- Traitement côté client: Les identificateurs de fragment sont traités par le client et ne sont pas envoyés au serveur
- Navigation dans le document: Couramment utilisé pour les ancres dans les documents HTML
- 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
| Composant | Préfixe | Requis | Exemple | Description |
|---|---|---|---|---|
| scheme | - | Oui | http | Protocole/schéma |
| authority | // | Non | user@host:port | Informations d'autorité |
| path | - | Oui* | /path/to/resource | Chemin de ressource |
| query | ? | Non | key=value | Paramètres de requête |
| fragment | # | Non | section1 | Identificateur 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
| Composant | Valeur |
|---|---|
| scheme | https |
| userinfo | user:pass |
| host | www.example.com |
| port | 8080 |
| path | /path/to/page |
| query | key=value |
| fragment | section |
Exemple 2: URI Mailto
mailto:[email protected]?subject=Hello
| Composant | Valeur |
|---|---|
| scheme | mailto |
| path | [email protected] |
| query | subject=Hello |
Exemple 3: URI File
file:///home/user/document.txt
| Composant | Valeur |
|---|---|
| scheme | file |
| authority | (vide) |
| path | /home/user/document.txt |
Règles d'encodage des composants
Différents composants autorisent différents jeux de caractères:
| Composant | Caractères spéciaux autorisés | Doit être encodé |
|---|---|---|
| scheme | + - . | Tous les autres |
| userinfo | : ! $ & ' ( ) * + , ; = | Tous les autres |
| host | - . _ (reg-name) | Tous les autres |
| port | 0-9 | Tous 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