Der Apache hat durch das Negotiation-Moduls die Fähigkeit, seine Antworten an die Wünsche und Fähigkeiten des Web-Clients anzupassen. Liegt ein Dokument beispielsweise in deutscher und englischer Sprache vor, so kann der Apache aus Basis der Client-Anfrage automatisch entscheiden, welche der beiden Varianten zurückgeliefert werden soll.
Funktionsprinzip [zurück]
Der Apache hat die Fähigkeit, eine Antwort an die Wünsche und Fähigkeiten des Web-Clients anzupassen. Der Web-Client handelt quasi bei einem Zugriff aus (daher resultiert der Begiff Content Negotiation), welche Variante einer Datei er gerne hätte. Liegt eine Bilddatei beispielsweise in den Formaten PNG, GIF und JPG vor, so könnte an einen Client der PNG-Dateien (Portable Network Graphic) verarbeiten kann, diese Variante des Bildes geliefert werden. Die Auswahl einer geeigneten Variante läuft hierbei für die Client-Seite transparent ab.
Dieser Mechanismus wird als Transparent Content Negotiation oder manchmal auch als Content Arbitration bezeichnet.
Auf der Seite des Apache ist - abgesehen von der Erstellung der verschiedenen Dateivarianten - die Erstellung einer Type-Map oder der Aktivierung einer sogenannten MultiViews-Suche notwendig.
Konfiguration [zurück]
Bevor wir jedoch zur Anwendung der Content Negotiation kommen, sollen zunächst die dafür notwendigen Konfigurationsschritte betrachtet werden.
Aktiviert werden Type-Maps über die Zuweisung des Handlers type-map zu einer Dateiendung, wobei typischerweise die Endung .var (für variant) benutzt wird.
AddHandler type-map varGibt man die AddHandler-Anweisung global in der Server-Konfiguration an, so werden Dateien mit der Endung .var in allen Verzeichnissen des Web-Servers als Type-Maps deklariert. Will man die Nutzung der Type-Maps einschränken, so bietet sich eine Beschränkung auf bestimmte Verzeichnisse an, z.B.:
<Location /test> AddHandler type-map var </Location>
Aktiviert wird die MultiViews-Suche über die Option MultiViews, die, wie im folgenden Beispiel, typischerweise auf bestimmte Verzeichnisse beschränkt wird:
<Location /test> Options +MultiViews </Location>Zu beachten ist, daß die Option MultiViews die einzige Option ist, die nicht über die Anweisung Options All aktiviert wird.
Der Ablauf einer MultiViews-Suche ergibt sich wie folgt: Bei einem Zugriff auf eine nicht existierende Datei, z.B. /test/page, in einem Verzeichnis, für das MultiViews aktiviert wurde, sucht der Apache intern nach allen Dateien /test/page.* und erstellt anhand der gefunden Dateien intern eine Type-Map, auf deren Basis dann entschieden wird, welche Datei an den Web-Client zurückgeliefert werden soll. Wird keine passende Datei gefunden, wird eine normale »Datei nicht gefunden«-Fehlermeldung an den Client zurückgeliefert.
Die MultiViews-Suche wird in erster Linie angewendet, wenn Dokumente in verschiedenen Sprachen angeboten werden sollen, z.B. Deutsch und Englisch. Damit der Apache herausfinden kann, in welcher Sprache ein Dokument vorliegt, kennzeichnet man dies über einen zuvor via AddLanguage definierten Dateizusatz. Dieser Zusatz des Dateinamens entspricht in der Regel dem Sprachkürzel der jeweiligen Sprache, so wie es in ISO 639 definiert ist.
Hier ein Beispiel für ein Dokument, das in englischer und deutscher Sprache vorliegt:
page.html.de page.html.enFordert ein Web-Client in einer Anfrage keine spezifische Sprache an, so wird das Dokument zurückgeliefert, das bezüglich der verwendeten Sprache die höchste Priorität hat. Gekennzeichnet wird dies in der Konfiguration durch die LanguagePriority-Anweisung.
Syntax | AddLanguage Sprache Name [Name ...] |
---|---|
Modul | mod_mime |
Kontext | Server-Konfiguration, <VirtualHost>, <Directory>, <Location>, .htaccess |
Beispiele:
AddLanguage de .de AddLanguage en .en AddLanguage pl .poDas letzte Beispiel fällt etwas aus dem Rahmen: Bei der polnischen Sprache sollte als Dateiendung nicht pl, sondern z.B. po verwendet werden, um Probleme mit eventuell vorhandenen Perl-Dokumenten zu vermeiden, die ja bekanntlich auch die Dateiendung .pl haben.
Syntax | LanguagePriority Sprache [Sprache ...] |
---|---|
Modul | mod_negotiation |
Kontext | Server-Konfiguration, <VirtualHost>, <Directory>, <Location>, .htaccess |
Beispiel:
LanguagePriority en de frDie zuerst angegebene Sprache hat hierbei die höchste Prioriät. Im obigen Beispiel haben somit englische Dokumente die höchste Priorität, deutsche Dokumente die zweithöchste und französische Dokumente die niedrigste Priorität.
Übermittelt ein Client z.B. den Header
Accept-Language: de, enso wird ihm das englische Dokumente übermittelt.
Bei LanguagePriority sollte man darauf achten, nur die Sprachen anzugeben, die man auch auf dem Web-Server verwendet.
Syntax | CacheNegotiatedDocs |
---|---|
Default | (Caching von Variationen wird verhindert) |
Modul | mod_negotiation |
Kontext | Server-Konfiguration |
Nutzung von Type-Maps und MultiViews [zurück]
Eine Type-Map hat dasselbe Format wie Mail-Header (RFC822), wobei insgesamt sechs verschiedene Header vom Apache erkannt bzw. genutzt werden:
URI
Als URI wird der Dateiname relativ zum aktuellen Verzeichnis angegeben, also z.B.
URI: page.htmloder
URI: ../page.htmlDie Angabe eines absoluten URI ist nicht möglich.
Der Content-Type-Header muß bei jeder Variante in einer Type-Map angegeben werden, auch wenn alle Varianten denselben MIME-Typ haben!
Beispiele:
Content-Type: text/html Content-Type: image/gif; qs=0.5 Content-Type: text/plain; qs=0.4; charset=iso-8859-5
Beispiel:
Content-Language: deDa es aber auch unterschiedliche Varianten innerhalb einer Sprache geben kann, kann bei Bedarf auch ein zweistelliges Länderkürzel angehängt werden, z.B. unterscheidet sich das Englisch, das in den USA gesprochen wird, vom Englisch, das in Großbritannien gesprochen wird.
Sprach- und Länderkennzeichnung werden durch ein »-« getrennt.
Beispiel:
Content-Language: en-GBFordert ein Client beispielsweise die Sprache »en-GB« an, so wird ihm die »en-GB«-Variante oder - falls diese nicht verfügbar ist - die »en«-Variante zurückgeliefert. Andersherum erhält er die »en-GB«-Variante, wenn er »en« übermittelt hat, aber keine andere englischsprachige Variante vorliegt.
Vergleiche hierzu die HTTP/1.1-Spezifikationen in RFC 2068.
Beispiele:
Content-Encoding: gzip Content-Encoding: compress
Hier ein Beispiel solch einer Fehlermeldung:
Beispiele:
Description: "Original english version" Description: "German HTML document" Description: BlafaselJeder der oben genannten Header darf mehrfach in einer Type-Map auftreten, allerdings pro Dateivariante nur einmal. Jede Beschreibung einer Variante enthält mindestens den URI-Header und den Content-Type-Header und wird durch eine Leerzeile von den Beschreibungen der anderen Varianten getrennt. Zeilen, die mit »#« beginnen, werden als Kommentar angesehen und nicht weiter beachtet.
Beispiel einer Type-Map-Datei:
# # type-map: /test/page.var # URI: page.de.html Content-Type: text/html; qs=0.8 Content-Language: de Description: "German HTML document" URI: page.en.html Content-Type: text/html; qs=0.8 Content-Language: en Description: "English HTML document" URI: page.txt Content-Type: text/plain; qs=0.1 Content-Language: en Description: "English plain text document" URI: page.pdf Content-Type: application/pdf; qs=1 Content-Language: en Description: "English PDF document"Ein Zugriff auf den URL http://www.domain.tld/test/page.var würde eine der Varianten page.de.html, page.en.html, page.txt oder page.pdf zurückliefern. Falls der Client nur Dokumente in deutscher Sprache haben möchte, so würde ihm ohne weitere Nachfrage die deutsche Version des HTML-Dokuments page.de.html übermittelt, auch wenn er PDF-Dokumenten eine höhere Präferenz einräumt. Aktzeptiert er hingegen auch Dokumente in englischer Sprache, würde ihm die Variante page.pdf übermittelt, da sie den höchsten Qualitätswert »qs« hat.
Beispiel-Header:
Accept: image/png;q=1, image/gif;q=0.5, image/jpeg;q=0.7Der obige Beispiel-Header bringt zum Ausdruck, daß der Client die Image-Formate PNG, GIF und JPG verarbeiten kann und dabei PNG-Dateien den Vorzug gibt (q=1). Liegt keine PNG-Variante vor, so liefert der Apache die JPEG-Datei oder, falls diese auch nicht vorhanden ist, die GIF-Datei zurück. Kann keinem der Wünsche des Web-Clients entsprochen werden, so antwortet der Apache, wie schon zuvor gesagt, mit einer 406-Fehlermeldung.
Beispiel einer Type-Map für die drei Dateien bild.png, bild.gif und bild.jpg:
# # type-map: bild.var # URI: bild.png Content-Type: image/png; qs=0.6 Description: "Truecolor PNG image" URI: bild.gif Content-Type: image/gif; qs=1 Description: "256color GIF image" URI: bild.jpg Content-Type: image/jpeg; qs=0.6 Description: "Truecolor JPEG image with 70% quality-level"Würde ein Client auf bild.var zugreifen und dabei den oben angegebenen Beispiel-Header übermitteln, so würde die PNG-Variante vom Apache zurückgeschickt. Die Qualitätswerte der Client-Anfrage werden mit den Qualitätswerten der Type-Map kombiniert, und die bestmögliche Kombination wird an den Client ausgeliefert. Hätte der Client als Qualitätswert für den MIME-Typ image/png den Wert 0.5 angegeben, so wäre ihm vom Apache die GIF-Variante des Bildes übermittelt worden.
Beispiel-Header:
Accept-Language: de, en;q=0.9, fr;q=0.2Verbal ausgedrückt, bedeutet der Header: »Ich bevorzuge Deutsch, aber nehme auch Englisch und im Notfall sogar Französisch.«
Beispiel einer Type-Map für ein HTML-Dokument, das in den Sprachen Deutsch, Englisch und Französisch vorliegt:
# # type-map: page.var # URI: page.html.de Content-Type: text/html Content-Language: de Description: "German document (original version)" URI: page.html.en Content-Type: text/html Content-Language: en Description: "English document (translated version)" URI: page.html.fr Content-Type: text/html Content-Language: fr Description: "French document (translated version)"Betrachtet man einen Zugriff auf page.var mit obigem Beispiel-Header, so würde die deutsche Version des HTML-Dokuments an den Client übermittelt.
Beispiel-Header:
Accept-Charset: iso-8859-1, unicode-1-1;q=0.8Beispiel einer Type-Map für zwei HTML-Dokumente:
# # type-map: page.var # URI: page.html Content-Type: text/html; qs=1; charset=iso-8859-1 Description: "test document (iso)" URI: page.uni.html Content-Type: text/html; qs=1; charset=unicode-1-1 Description: "test document (unicode)"
Beispiel-Header:
Accept-Encoding: gzip, compressBeispiel einer Type-Map für ein Postscript-Dokument:
# # type-map: info.var # URI: info.ps.Z Content-Type: application/postscript Content-Encoding: compress Description: "info document (compress)" URI: info.ps.gz Content-Type: application/postscript Content-Encoding: gzip Description: "info document (gzip)"Je nachdem, ob ein Client compress oder gzip akzeptiert, wird vom Apache entweder info.ps.Z oder info.ps.gz zurückgeliefert. Falls ein Client beide Kodierungsformate akzeptiert, wird eine der beiden Varianten ausgeliefert werden, jedoch kann nicht vorherbestimmt werden, welche dies ist (bei der jetzigen Implementierung des Negotiation-Moduls würde die zuletzt genannte Variante aus der Type-Map genommen). Gibt man einen entsprechenden Qualitätswert beim Content-Type-Header an, läßt sich eine Präferenz bezüglich der beiden Formate festlegen.
Hier ein Beispiel für ein Dokument, das als HTML- und TXT-Datei, jeweils in zwei verschiedenen Zeichensätzen und jeweils in deutscher und englischer Sprache vorliegt:
# # type-map: extrem.var # URI: extrem-iso.html.de Content-Type: text/html; qs=0.9; charset=iso-8859-1 Content-Language: de Description: "German HTML document, iso-8859-1" URI: extrem-iso.html.en Content-Type: text/html; qs=0.9; charset=iso-8859-1 Content-Language: en Description: "English HTML document, iso-8859-1" URI: extrem-iso.txt.de Content-Type: text/plain; qs=0.2; charset=iso-8859-1 Content-Language: de Description: "German plain text document, iso-8859-1" URI: extrem-iso.txt.en Content-Type: text/plain; qs=0.2; charset=iso-8859-1 Content-Language: en Description: "English plain text document, iso-8859-1" URI: extrem-uni.html.de Content-Type: text/html; qs=0.9; charset=unicode-1-1 Content-Language: de Description: "German HTML document, unicode-1-1" URI: extrem-uni.html.en Content-Type: text/html; qs=0.9; charset=unicode-1-1 Content-Language: en Description: "English HTML document, unicode-1-1" URI: extrem-uni.txt.de Content-Type: text/plain; qs=0.2; charset=unicode-1-1 Content-Language: de Description: "German plain text document, unicode-1-1" URI: extrem-uni.txt.en Content-Type: text/plain; qs=0.2; charset=unicode-1-1 Content-Language: en Description: "English plain text document, unicode-1-1"
Genau diese Funktionalität verbirgt sich hinter der MultiViews-Suche, die jedoch nicht so flexibel einsetzbar ist wie Type-Maps.
Die Konfiguration und der Ablauf einer MultiViews-Suche wurde bereits zuvor im Konfigurationsabschnitt erläutert und soll hier nicht noch einmal betrachtet werden.
Die Funktion einer MultiViews-Suche ist identisch zu einer Type-Map, mit dem Unterschied, daß man selbst keinerlei Type-Map-Dateien erstellen muß, aber hierdurch auch etwas an Flexibilität verliert.
Anwendungsbeispiel:
Das Verzeichnis /test enthält die drei Dateien page.html, page.txt und page.pdf. Ein Client greift auf http://www.domain.tld/test/page zu und sendet dabei den folgenden Accept-Header:
Accept: text/html;q=1, text/plain;q=0.5, application/pdf;q=0.8Der Apache übermittelt in diesem Fall die Datei page.html, da der Client hierfür den höchsten Qualitätswert angegeben hat. Gibt der Client keine Qualitätswerte für die verschiedenen MIME-Typen an, kann nicht vorhergesagt werden, welche der drei Varianten ihm übergeben wird. Hier wirkt sich der Nachteil der geringeren Flexibilität der MultiViews-Suche aus, da man selbst keine Präferenzen für die einzelnen Formate vergeben kann.
Die Verwendung von MultiViews ist in solchen Fällen somit weniger geeignet. Ganz unmöglich ist die Verwendung einer MultiViews-Suche, wenn Varianten in verschiedenen Zeichensätzen vorliegen, da dies nur in einer Type-Map angegeben und nicht über eine Dateiendung kenntlich gemacht werden kann.
Hervorragend eignet sich eine MultiViews-Suche jedoch, wenn man Dokumente in verschiedenen Sprachen anbietet.
Ein Dateiname ist nach folgender Regel aufgebaut: Name.Typ.Sprache.Kodierung
Beispiele:
page.html.de info.txt.de.gzIn einem Hyperlink würde man auf page.html bzw. info.txt verweisen.
Der Apache verarbeitet jedoch auch Dateinamen der folgenden Art:
page.de.htmlAls Hyperlink würde in solch einem Fall page ohne weitere Dateiendung benutzt.
Damit der Apache auch weiß, daß z.B. »de« für Deutsch und »en« für Englisch steht, zeigt man ihm dies über die Konfigurationsanweisung AddLanguage an. Falls ein Web-Client keinen Accept-Language-Header übermittelt, wird eine Variante ausgewählt, die der angegebenen LanguagePriority entspricht.
Online-Ressourcen [zurück]
|
Der Autor [zurück]
Lars Eilebrecht studiert - sofern er nicht gerade Bücher über
Apache schreibt - Technische Informatik an der Uni-GH Siegen und ist Mitglied
der dortigen Unix-AG. In erster Linie betreut er die Web-Server der Unix-AG,
sowie den zentralen Web-Server der Universität. Sofern es die Zeit
erlaubt engagiert sich der Autor beim Apache-Projekt, vorwiegend im Rahmen
der Betreuung der Bug-Report-Database.
E-Mail: sfx@unix-ag.org |
© 1998 Lars Eilebrecht, International Thomson Publishing GmbH | A P A C H E |