Zum Hauptinhalt springen

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:

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

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

  1. Clientseitige Verarbeitung: Fragmentidentifikatoren werden vom Client verarbeitet und nicht an den Server gesendet
  2. Dokumentinterne Navigation: Häufig für Anker in HTML-Dokumenten verwendet
  3. 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

KomponentePräfixErforderlichBeispielBeschreibung
scheme-JahttpProtokoll/Schema
authority//Neinuser@host:portAutoritätsinformationen
path-Ja*/path/to/resourceRessourcenpfad
query?Neinkey=valueAbfrageparameter
fragment#Neinsection1Fragmentidentifikator

*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
KomponenteWert
schemehttps
userinfouser:pass
hostwww.example.com
port8080
path/path/to/page
querykey=value
fragmentsection

Beispiel 2: Mailto-URI

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

Beispiel 3: File-URI

file:///home/user/document.txt
KomponenteWert
schemefile
authority(leer)
path/home/user/document.txt

Komponenten-Kodierungsregeln

Verschiedene Komponenten erlauben verschiedene Zeichensätze:

KomponenteErlaubte SonderzeichenMuss kodiert werden
scheme+ - .Alle anderen
userinfo: ! $ & ' ( ) * + , ; =Alle anderen
host- . _ (reg-name)Alle anderen
port0-9Alle anderen
path: @ ! $ & ' ( ) * + , ; =Alle anderen
query: @ / ? ! $ & ' ( ) * + , ; =Alle anderen
fragment: @ / ? ! $ & ' ( ) * + , ; =Alle anderen

Nächstes Kapitel: 4. URI-Referenz (URI Reference) - URI-Referenzen und relative Referenzen