3. Syntaxkomponenten (Syntax Components)
Die generische URI-Syntax besteht aus einer hierarchischen Folge von Komponenten, die als Schema (scheme), Autorität (authority), Pfad (path), Abfrage (query) und Fragment (fragment) bezeichnet werden.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
Beispiel der Komponentenstruktur:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
Die folgenden Abschnitte bieten detaillierte Beschreibungen jeder Komponente.
3.1. Schema (Scheme)
Jeder URI beginnt mit einem Schemanamen, der sich auf eine Spezifikation für die Zuweisung von Identifikatoren innerhalb dieses Schemas bezieht. Schemanamen bestehen aus einer Zeichenfolge, die mit einem Buchstaben beginnt, gefolgt von einer beliebigen Kombination aus Buchstaben, Ziffern, Plus ("+"), Punkt (".") oder Bindestrich ("-").
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
Beispiele:
httphttpsftpmailtofiledatatel
Schemanamen sind nicht groß-/kleinschreibungssensitiv. Die kanonische Form ist Kleinschreibung, und Normalisierer sollten (SHOULD) Schemanamen in Kleinbuchstaben umwandeln.
Hinweis: Obwohl Schemas nicht groß-/kleinschreibungssensitiv sind, sollten Produzenten und Normalisierer Kleinbuchstaben verwenden.
3.2. Autorität (Authority)
Die Autoritätskomponente besteht aus einer optionalen Benutzerinformations-Unterkomponente, einer Host-Unterkomponente und einer optionalen Port-Unterkomponente, denen zwei Schrägstriche ("//") vorangestellt sind.
authority = [ userinfo "@" ] host [ ":" port ]
Vollständiges Beispiel:
user:[email protected]:8080
\__________/ \______________/ \__/
userinfo host port
3.2.1. Benutzerinformationen (User Information)
Die userinfo-Unterkomponente kann aus einem Benutzernamen und optional schema-spezifischen Informationen darüber bestehen, wie die Autorisierung für den Zugriff auf die Ressource erlangt werden kann.
userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
Beispiele:
user@hostuser:password@host(veraltet, Sicherheitsrisiko)anonymous@host
Sicherheitswarnung: Das Einbeziehen von Passwörtern in URIs ist veraltet, da Passwörter in Logs, Verlauf usw. offengelegt werden können.
3.2.2. Host (Host)
Die Host-Unterkomponente kann ein registrierter Name (einschließlich, aber nicht beschränkt auf einen Hostnamen) oder eine IP-Adresse sein. IPv6-Adressen müssen (MUST) in eckige Klammern eingeschlossen werden.
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 )
Beispiele für Host-Typen:
1. Registrierter Name
www.example.com
example.org
localhost
2. IPv4-Adresse
192.0.2.1
127.0.0.1
3. IPv6-Adresse
[2001:db8::1]
[::1]
[fe80::1]
4. Zukünftige IP-Version
[v9.abc:def]
Host-Normalisierung: Hostnamen sind nicht groß-/kleinschreibungssensitiv und sollten (SHOULD) in Kleinbuchstaben normalisiert werden.
3.2.3. Port (Port)
Die Port-Unterkomponente ist optional und wird in Dezimalziffern dargestellt.
port = *DIGIT
Beispiele:
http://example.com:80/(HTTP-Standardport)https://example.com:443/(HTTPS-Standardport)http://example.com:8080/(benutzerdefinierter Port)
Standardport: Wenn der Port leer oder nicht angegeben ist, wird der Standardport für das Schema angenommen.
3.3. Pfad (Path)
Die Pfadkomponente enthält Daten, die zusammen mit Daten in der Abfragekomponente dazu dienen, eine Ressource im Bereich des URI-Schemas und der Namensautorität zu identifizieren. Der Pfad besteht aus einer Folge von Pfadsegmenten, die durch einen Schrägstrich ("/") getrennt sind.
path = path-abempty ; beginnt mit "/" oder ist leer
/ path-absolute ; beginnt mit "/" aber nicht "//"
/ path-noscheme ; beginnt mit Nicht-Doppelpunkt-Segment
/ path-rootless ; beginnt mit einem Segment
/ path-empty ; null Zeichen
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 / ":" / "@"
Beispiele für Pfadtypen:
1. Absoluter Pfad
/path/to/resource
/index.html
/
2. Relativer Pfad
path/to/resource
../parent/resource
resource
3. Leerer Pfad
http://example.com
Pfadsegmente: Ein Pfad besteht aus Segmenten, die durch Schrägstriche getrennt sind. Besondere Segmente umfassen:
.(aktuelles Verzeichnis)..(übergeordnetes Verzeichnis)
3.4. Abfrage (Query)
Die Abfragekomponente enthält nicht-hierarchische Daten, die zusammen mit Daten in der Pfadkomponente dazu dienen, eine Ressource zu identifizieren. Die Abfragekomponente wird durch ein Fragezeichen ("?") angezeigt.
query = *( pchar / "/" / "?" )
Beispiele für Abfragezeichenfolgen:
?key=value
?name=John&age=30
?search=hello+world
?filter[]=a&filter[]=b
?q=%E4%BD%A0%E5%A5%BD
Gängiges Format: Obwohl die URI-Spezifikation das Format der Abfragezeichenfolge nicht definiert, ist das Format von key=value-Paaren, die durch & getrennt sind, zum De-facto-Standard geworden:
?key1=value1&key2=value2&key3=value3
3.5. Fragment (Fragment)
Die Fragmentkomponente ermöglicht die indirekte Identifizierung einer sekundären Ressource innerhalb einer Darstellung der durch den URI identifizierten Ressource. Der Fragmentidentifikator wird durch ein Rautezeichen ("#") angezeigt.
fragment = *( pchar / "/" / "?" )
Fragment-Beispiele:
#section1
#top
#chapter-3
#line-42
Wichtige Eigenschaften:
- Clientseitige Verarbeitung: Fragmentidentifikatoren werden vom Client verarbeitet und nicht an den Server gesendet
- Dokumentinterne Navigation: Häufig für Anker in HTML-Dokumenten verwendet
- Sekundäre Ressource: Identifiziert einen Teil der primären Ressource
Beispiel:
http://example.com/page.html#section2
- Server empfängt:
http://example.com/page.html - Client navigiert zu:
#section2
Zusammenfassung der URI-Komponenten
| Komponente | Präfix | Erforderlich | Beispiel | Beschreibung |
|---|---|---|---|---|
| scheme | - | Ja | http | Protokoll/Schema |
| authority | // | Nein | user@host:port | Autoritätsinformationen |
| path | - | Ja* | /path/to/resource | Ressourcenpfad |
| query | ? | Nein | key=value | Abfrageparameter |
| fragment | # | Nein | section1 | Fragmentidentifikator |
*Pfad kann leer sein
Aufschlüsselung vollständiger URI-Beispiele
Beispiel 1: HTTP-URL
https://user:[email protected]:8080/path/to/page?key=value#section
| Komponente | Wert |
|---|---|
| scheme | https |
| userinfo | user:pass |
| host | www.example.com |
| port | 8080 |
| path | /path/to/page |
| query | key=value |
| fragment | section |
Beispiel 2: Mailto-URI
mailto:[email protected]?subject=Hello
| Komponente | Wert |
|---|---|
| scheme | mailto |
| path | [email protected] |
| query | subject=Hello |
Beispiel 3: File-URI
file:///home/user/document.txt
| Komponente | Wert |
|---|---|
| scheme | file |
| authority | (leer) |
| path | /home/user/document.txt |
Komponenten-Kodierungsregeln
Verschiedene Komponenten erlauben verschiedene Zeichensätze:
| Komponente | Erlaubte Sonderzeichen | Muss kodiert werden |
|---|---|---|
| scheme | + - . | Alle anderen |
| userinfo | : ! $ & ' ( ) * + , ; = | Alle anderen |
| host | - . _ (reg-name) | Alle anderen |
| port | 0-9 | Alle anderen |
| path | : @ ! $ & ' ( ) * + , ; = | Alle anderen |
| query | : @ / ? ! $ & ' ( ) * + , ; = | Alle anderen |
| fragment | : @ / ? ! $ & ' ( ) * + , ; = | Alle anderen |
Nächstes Kapitel: 4. URI-Referenz (URI Reference) - URI-Referenzen und relative Referenzen