URI: URL, URN, Aufbau und Kodierung verstehen
Du unterscheidest Bezeichner, Zugriffsadressen und Namen, zerlegst Adressen und übst Prozentkodierung sowie relative Verweise.
Kurz gesagt
Eine URI (Uniform Resource Identifier) ist eine Zeichenfolge, die eine Ressource bezeichnet, etwa ein Bild oder ein Dokument. Sie kann einen Zugriffsweg, einen dauerhaften Namen oder beides liefern. Einen erfolgreichen Zugriff garantiert sie nicht.
An einer Webadresse kannst du erkennen, welches Regelwerk gilt und welche Daten angesprochen werden. Alle Adressen, Dateien und Situationen dieser Lektion sind ausgedachte Übungsdaten. Die Regeln folgen dem Internetstandard RFC 3986; RFC steht für „Request for Comments“ und bezeichnet eine Reihe technischer Dokumente.
Deine Lernziele
Eine URI ist ein „Uniform Resource Identifier“, auf Deutsch etwa ein einheitlicher Bezeichner für eine Ressource. Eine Ressource ist etwas, das bezeichnet wird: zum Beispiel ein Dokument, ein Bild oder ein abstrakter Begriff. Eine URI identifiziert eine Ressource. Sie garantiert nicht, dass du darauf zugreifen kannst.
Eine URL ist ein „Uniform Resource Locator“. Sie ist eine URI, die zusätzlich einen Zugriffsweg beschreibt. Jede URL ist also eine URI. Eine URL allein verspricht weder die aktuelle Erreichbarkeit noch einen dauerhaft beibehaltenen Namen.
Eine URN ist ein „Uniform Resource Name“. Im engeren Sinn bezeichnet das eine URI mit dem Schema urn. Das Schema ist die Kennung vor dem ersten Doppelpunkt und legt das Regelwerk für diese Art von URI fest. Eine URN soll als weltweit eindeutiger und dauerhafter Name dienen. Der Name soll auch bestehen bleiben, wenn die Ressource verschwindet oder unerreichbar wird. Er bleibt an die ursprünglich benannte Ressource gebunden.
Der Begriff URN wurde auch weiter für URI mit Namenseigenschaften verwendet. Namen und Zugriffswege sind keine zwingend getrennten Klassen: Eine URI kann beides leisten. Du darfst aus einer Namensfunktion deshalb nicht schließen, dass ein Zugriffsweg ausgeschlossen ist.
Identifizieren
Identifizieren heißt hier: durch einen Bezeichner kenntlich machen, welche Ressource gemeint ist. Das verspricht keinen erfolgreichen Zugriff.
Beispiel: Ein Bild in einer ausgedachten Sammlung
- 1https://example.org/motive/wolke.png bezeichnet ein Bild und beschreibt über das Schema https einen Zugriffsweg.
- 2Diese Zeichenfolge ist eine URL und damit auch eine URI.
- 3Ob das Bild gerade erreichbar ist, lässt sich daraus nicht ableiten.
Teste dich
Die allgemeine URI-Struktur unterscheidet Schema, Authority, Pfad, Query und Fragment. Das Schema steht vor dem ersten Doppelpunkt. Es verweist auf das Regelwerk der URI. Schema und Pfad gehören zur allgemeinen Struktur; der Pfad darf leer sein. Authority, Query und Fragment können fehlen.
Die Authority ist die Zuständigkeitsangabe. Bei unseren https-Beispielen enthält sie den Host, also den Servernamen oder eine Serveradresse, und gegebenenfalls einen Port. Ein Port ist eine Nummer zur Unterscheidung von Diensten an einem Host. Je nach Schema können auch Benutzerangaben zur Authority gehören. Vor der Authority stehen zwei Schrägstriche, also //. Diese gehören nicht zur Authority selbst. Sie endet vor dem nächsten /, ? oder # oder am Ende der URI.
Der Pfad enthält die nachfolgenden Angaben zur Ressource. Seine durch / getrennten Stücke heißen Pfadsegmente. Ein Pfad muss keine echte Datei und keine echten Ordner auf einem Server abbilden. Ist eine Authority vorhanden, beginnt ein nicht leerer Pfad mit /. Die Query enthält zusätzliche, nicht nach Verzeichnisebenen geordnete Angaben. Sie beginnt nach dem ersten Fragezeichen ? und endet vor # oder am Ende. Das Fragezeichen gehört nicht zum Query-Wert.
Das Fragment steht nach dem Zeichen #. Es kann zum Beispiel einen Teil einer dargestellten Seite bezeichnen. Seine genaue Bedeutung hängt vom Format und Inhalt der Darstellung ab. # gehört nicht zum Fragment-Wert. Für die folgende Übungsadresse nehmen wir an, dass zeiten als Kennung eines Abschnitts der dargestellten Seite definiert ist.
Die Übungsadresse lautet https://example.org:8443/kurse/plan.html?sprache=de&ansicht=kurz#zeiten. In ihrer Query verbindet = jeweils einen Namen mit einem Wert; & trennt zwei Angaben. Das ist die hier gewählte Form der Query. Andere URI müssen ihre Query nicht auf diese Weise aufbauen.
| Bestandteil | Wert im Beispiel | Funktion |
|---|---|---|
| Schema | https | Verweist auf das Regelwerk dieser URI. |
| Authority | example.org:8443 | Enthält hier den Host example.org und den Port 8443. |
| Pfad | /kurse/plan.html | Enthält die Pfadangaben zur Ressource. |
| Query | sprache=de&ansicht=kurz | Enthält hier Angaben zur Sprache und zur Ansicht. |
| Fragment | zeiten | Bezeichnet hier den zuvor festgelegten Abschnitt. |
Merke: Authority und Host sind nicht dasselbe: Zur Authority können weitere Angaben gehören. Auch eine Query und ein Fragment sind unterschiedliche Bestandteile.
Teste dich
Bei der Prozentkodierung stellst du ein Byte durch das Prozentzeichen % und zwei Hexadezimalziffern dar. Ein Byte besteht aus acht Bit; ein Bit hat den Wert 0 oder 1. Hexadezimal ist eine Zahlenschreibweise mit sechzehn Ziffern: 0 bis 9 und A bis F. Dabei stehen A bis F für die Werte zehn bis fünfzehn. Eine Prozentgruppe wie %20 stellt also ein Byte dar, nicht einen Prozentwert.
Für alle Kodieraufgaben hier gilt UTF-8. Das bedeutet „8-bit Unicode Transformation Format“. Unicode ist ein Zeichensystem; UTF-8 legt fest, wie seine Zeichen durch Bytes dargestellt werden. Ein Zeichen kann dabei mehrere Bytes benötigen. Für jedes zu kodierende Byte entsteht eine eigene Prozentgruppe. Deshalb benötigt ein Umlaut in unseren Beispielen zwei Gruppen. Die Tabelle gibt die benötigten Bytewerte in hexadezimaler Schreibweise an. Wir verwenden große Buchstaben in den Gruppen; kleine Hexadezimalbuchstaben hätten denselben Wert.
Unreservierte Zeichen haben keine festgelegte Trennaufgabe: die Buchstaben A bis Z und a bis z, die Ziffern 0 bis 9 sowie Bindestrich, Punkt, Unterstrich und die Tilde ~. Diese Zeichen dürfen unverändert bleiben. Leerzeichen werden zu %20. Ein als Dateninhalt gemeintes Prozentzeichen wird zu %25. Ein als Dateninhalt gemeintes # wird zu %23. Die Zeichen /, ? und # bleiben dagegen erhalten, wenn sie Bestandteile der URI voneinander trennen. Kodierst du solche Trenner, kann sich die Bedeutung der URI ändern.
Kodiere neue Daten, bevor du daraus die URI zusammensetzt. Kodiere bereits kodierte Daten nicht erneut: Aus %20 würde beim erneuten Kodieren seines Prozentzeichens %2520. Das steht dann für den Text %20 statt für ein Leerzeichen.
Eine relative Referenz ist ein Verweis ohne eigenes Schema mit anschließendem Doppelpunkt. Für das vollständige Auflösen unserer Beispiele ist eine Basis-URI gegeben. Bei den hier verwendeten Referenzen ohne eigene Authority werden Schema und Authority der Basis übernommen. Den Teil des Basispfads bis einschließlich des letzten / nennen wir das aktuelle URI-Verzeichnis. Ein relativer Dateipfad wird dort angefügt. Endet der Basispfad nicht mit /, wird dabei also zunächst sein letztes Pfadsegment ersetzt.
Im relativen Pfad bedeutet . die aktuelle Ebene. .. führt zur übergeordneten Ebene; am obersten URI-Verzeichnis / bleibt es bei /. Diese Angaben werden beim Auflösen verarbeitet und aus dem Zielpfad entfernt. Gemeint sind Ebenen im URI-Pfad; daraus folgt keine Aussage über echte Ordner auf einem Server.
Eine Referenz wie #abschnitt bezieht sich in unseren Webbeispielen auf dasselbe Dokument. Ist abschnitt in der dargestellten Seite als Kennung eines Abschnitts festgelegt, bezeichnet der Verweis diesen Abschnitt. Ohne eine passende Definition im jeweiligen Darstellungsformat lässt sich aus dem Fragmenttext kein bestimmter Abschnitt ableiten.
| Zeichen | Bytes in UTF-8, hexadezimal | Prozentkodierung |
|---|---|---|
| Leerzeichen | 20 | %20 |
| ä | C3 A4 | %C3%A4 |
| ö | C3 B6 | %C3%B6 |
| ü | C3 BC | %C3%BC |
| % als Dateninhalt | 25 | %25 |
| Zeichen # als Dateninhalt | 23 | %23 |
Beispiel: Einen relativen Bildverweis auflösen
- 1Die Basis ist https://example.org/reisen/karten/start.html; die relative Referenz lautet ../bild.png.
- 2Das aktuelle URI-Verzeichnis ist /reisen/karten/: Das letzte Pfadsegment start.html wird ersetzt.
- 3.. führt von /reisen/karten/ eine Ebene höher zu /reisen/.
- 4Das vollständige Ziel lautet https://example.org/reisen/bild.png.
Merke: Prozentkodierung arbeitet pro Byte. Beim Auflösen eines relativen Dateipfads zählt dagegen die Lage im URI-Pfad der Basis.
Teste dich
Alles auf einen Blick
URI
Eine URI identifiziert eine Ressource und garantiert keine Erreichbarkeit.
Eine URL beschreibt einen Zugriffsweg; eine URN soll einen weltweit eindeutigen, dauerhaften Namen liefern. Die Eigenschaften können zusammenkommen.
Schema und Pfad gehören zur URI-Struktur. Der Pfad darf leer sein; Authority, Query und Fragment können fehlen.
Jedes zu kodierende Byte erhält eine Gruppe aus % und zwei Hexadezimalziffern. Ein UTF-8-Zeichen kann mehrere Gruppen benötigen.
Ein relativer Dateipfad wird vom aktuellen URI-Verzeichnis der Basis aus aufgelöst. .. führt eine Ebene höher, höchstens bis zum obersten URI-Verzeichnis /.
Ein Verweis wie #abschnitt betrifft hier dasselbe Dokument. Welchen Teil er bezeichnet, hängt von dessen Darstellung und einer passenden Definition ab.
Eine Bildadresse mit Umlaut und Leerzeichen bilden
- 1Die Basis ist https://example.org/sammlung/plaene/start.html. Gesucht ist die Datei „Grüne Karte.png“ eine URI-Verzeichnisebene höher.
- 2Wir verwenden UTF-8: ü → %C3%BC und Leerzeichen → %20. Die übrigen Zeichen des Dateinamens dürfen unverändert bleiben.
- 3Der kodierte Dateiname lautet Gr%C3%BCne%20Karte.png.
- 4Das aktuelle URI-Verzeichnis ist /sammlung/plaene/. Mit .. geht es nach /sammlung/.
- 5Die kodierte relative Referenz lautet ../Gr%C3%BCne%20Karte.png.
- 6Das vollständige Ziel ist https://example.org/sammlung/Gr%C3%BCne%20Karte.png.
Fehler finden
Fehler in Zeile 3Die dritte Zeile behandelt .. wie . und bleibt im aktuellen URI-Verzeichnis. Richtig: .. führt aus /archiv/berichte/ nach /archiv/. Das vollständige Ziel ist https://example.org/archiv/foto.png.
Lückentext
In https://example.org/lernen?fach=kunst#karte ist die Query . Beim Kodieren eines neuen Leerzeichens mit UTF-8 entsteht . Bei der Basis https://example.org/baum/zweig/start.html und der Referenz ../foto.png lautet der Zielpfad .