Content Negotiation mit .htaccess: Webinhalte optimal in Szene setzen
Veröffentlicht am 12.03.2020 von DomainFactory
Je besser ein Webinhalt zu den Erwartungen des Besuchers passt, desto erfolgreicher erreicht er sein Ziel. Apaches Funktionen für die Content Negotiation erlauben es, Webressourcen in unterschiedlichen Varianten zu präsentieren – zum Beispiel die optimale Sprachversion oder eine clientspezifische Grafikauflösung. Hier lesen Sie, wie Sie das per .htaccess-Datei flexibel steuern können.Ein gutes Nutzererlebnis dank passender Inhalte
Alternative Inhalte kommen immer dann zum Einsatz, wenn es darum geht, die Präsentation der Ressourcen einer Webseite an die technischen und sprachlichen Möglichkeiten des anfragenden Nutzers anzupassen. Schließlich soll jeder Besucher Ihre Webseite unter möglichst optimalen Bedingungen erleben. Wählt ein Nutzer aus Großbritannien die Webseite an, sollten die auf der Webseite enthaltenen Texte nach Möglichkeit in Englisch, aus Frankreich in Französisch und aus Deutschland in Deutsch erscheinen.
Alternative Inhalte aushandeln: Content Negotiation
Denn der Apache HTTP Server, den auch DomainFactory nutzt, erlaubt Webseiten-Betreibern die Einspeisung alternativer Inhalte über die Konfigurationsdatei .htaccess zu kontrollieren (mehr über .htaccess-Dateien erfahren Sie hier). Zuständig für die Content-Verhandlungen ist das Apache-Basismodul mod_negoation.
Ruft ein Nutzer eine Webseite auf, übermittelt sein Client dem Server per HTTP-Request-Header automatisch Informationen über von ihm präferierte Eigenschaften angeforderter Webinhalte. Im Einzelnen betrifft das folgende Eigenschaften:
- MIME-Typ (Header: Accept)
- Sprache (Header: Accept-language)
- Zeichensatz (Header: Accept-charset
- Kodierung (Header: Accept-encoding
Unter Zuhilfenahme einer .htaccess können diese Informationen vom Webserver ausgewertet und genutzt werden, um die angeforderten Inhalte automatisch in der für den Client optimalen Variante zu übertragen.
Inhaltsteuerung mit .htaccess
Die Content Negotiation von Apache wird immer dann aktiv, wenn der Server eine Verteilerliste („Type-Map“) mit den für eine angeforderte Ressource vorgesehenen Ressourcenvarianten erhält, die er mit den empfangenen Browser-Präferenzen abgleichen kann. So eine Liste kann Apache entweder automatisch erstellen oder er bekommt sie geliefert.
Administratoren von Websites stehen entsprechend zwei Möglichkeiten zur Auswahl, um ihren Nutzern alternative Inhalte per .htaccess-Datei zur Verfügung zu stellen.
Möglichkeit 1: Verteilerlisten automatisch erstellen mit MultiViews
Die Option MultiViews ist die zeitsparendere Methode, weil die Verteilerlisten zu den alternativen Inhalten automatisch erzeugt werden. Erstellen Sie zunächst für Ihre Webseite die gewünschten Ressourcenvarianten. In unserem Beispiel sind das zwei Sprachversionen Ihrer Startseite, index.htm.de und index.htm.en. In Ihre (vorhandene oder neu erstellte) .htaccess-Datei fügen Sie nun die folgende Direktive ein:
Options MultiViews
Damit wird Ihr Webserver angewiesen, beim Aufruf einer nicht existierenden Ressource (z. B. index.htm) nach alternativen Dateien index.* zu suchen, aus den Suchergebnissen (index.htm.de und index.htm.en) eine Art interne Type-Map zu erstellen und automatisch diejenige auszuwählen, die am besten mit den Präferenzen des anfragenden Clients übereinstimmt. MultiViews nutzt dafür die Dateiendungen – denn damit kann Apache nicht nur Content-Typ, sondern auch Sprache, Zeichensatz oder Encoding anzeigen (z. B. .gz für Gzip-komprimierte Dateien: index.htm.en.gz). Die Zuordnung übernimmt das Modul mod_mime.
❗ Beachten Sie bitte, dass die Option MultiViews die einzige Verzeichnis-Option ist, die nicht über die Anweisung Options All aktiviert wird.
Möglichkeit 2a: Type-Map-Datei manuell erstellen
Manuell erstellte Type-Map-Dateien sind zwar arbeitsintensiver, eröffnen jedoch die Möglichkeit, die konkrete Präsentation alternativer Inhalte flexibler zu steuern.
Auch hier müssen Sie zunächst die für Ihre Webseite gewünschten Ressourcenvarianten erstellen. Nehmen wir als Beispiel wieder zwei Sprachvarianten einer Startseite: deutsch.htm und englisch.htm. Hinzu kommt eine Verteilerdatei – in diesem Beispiel index.var genannt –, die sich im gleichen Verzeichnis befinden muss wie die vom Browser angeforderte Ressource.
In der .htaccess weisen Sie zunächst mit AddHandler type-map .var Dateien mit der Endung .var den Handler „type-map“ zu, der für Verteilerlisten-Dateien (Type-Maps) zuständig ist. .var-Dateien werden nun als Anweisungsdateien für alternative Inhalte angesehen. Mit der Direktive DirectoryIndex können Sie Apache sagen, welche Ressource der Server beim Aufruf des Verzeichnisses oder der Domain (ohne Dateiangabe) ausliefern soll. Weil genau das ja jetzt in unserer Datei index.var steht, ist es sinnvoll, diese hier anzugeben.
💡 Hinweis: Es kann nötig sein, in der .htaccess über die Direktive AddLanguage die gewünschten Dateiendungen je Sprache explizit festzulegen. Das geschieht per Sprachkürzel gemäß IETF/ISO 693 (zum Beispiel en, en-US, de, de-DE, de-CH). Für den Fall, dass der Browser keine Sprachpräferenz äußert und der Server keine eindeutige Wahl treffen kann, kann hier per LanguagePriority auch eine Rangfolge festgelegt werden. Ihr .htaccess-Code sieht also zum Beispiel so aus:
Beispiel-Code für .htaccess (Variante 2a):
AddHandler type-map .var
DirectoryIndex index.var
AddLanguage de .de
AddLanguage en .en
LanguagePriority de en
Die Type-Map-Datei
Nun müssen Sie noch die Verteilerdatei erstellen. Type-Map-Dateien sollten den gleichen Namen haben wie die Ressource, deren Varianten sie beschreiben, gefolgt von der Endung var. Sie enthalten zu jeder der bereitgestellten Dateien Informationen zu den Eigenschaften, in denen diese jewels variieren (also zu Mime-Typ, Sprache, Zeichensatz oder Kodierung). Es hat sich eingebürgert, den einzelnen Varianten eine übergeordnete Zeile für die Ressource voranzustellen und die variierenden Eigenschaften anzugeben (das ist aber nicht zwingend erforderlich). In unserem Beispiel sollen diesmal Varianten bei der Sprache und dem Dateityp zur Auswahl stehen:
URI: index; vary="type,language"
Dieser Eintrag und die folgenden Einträge zu alternativen Varianten (deutsch.htm und englisch.htm) werden durch Leerzeilen voneinander getrennt und beginnen grundsätzlich mit URI:. Die Angaben zu den Eigenschaften haben die Form von HTTP-Headern (Content-type, Content-language, Content-charset, Content-encoding).
In jedem Fall muss zunächst eine Angabe zum Content-type erfolgen (auch wenn wie in unserem Beispiel alle Dateien den gleichen MIME-Typ haben). Eine weitere Möglichkeit, die Content-Auswahl zu beeinflussen, ist die Angabe eines qs-Werts (Quality Score). Dieser kann zwischen den numerischen Werten 0.000 und 1.000 liegen. Reichen die vom Client zur Verfügung gestellten Informationen nicht aus, um den Webserver zwischen zwei Alternativen entscheiden zu lassen, liefert dieser die Variante, welche vom Webseiten-Administrator den höheren Wert zugesprochen bekommen hat. Der Eintrag zur Spracheigenschaft wird über Content-language: und ein Sprachkürzel definiert. Die komplette Beispiel-Type-Map sieht dann so aus:
Beispiel-Code einer Type-Map-Datei (Variante 2a):
URI: index; vary="type,language"
URI: deutsch.htm
Content-type: text/html; qs=1.0
Content-language: de
URI: english.htm
Content-type: text/html; qs=0.8
Content-language: en
Möglichkeit 2b: HTML-Datei als Type-Map
Schlussbemerkung: In der Konfiguration der Apache-Dokumentation findet sich noch eine andere Variante, die allerdings mit Vorsicht genutzt werden sollte und die in der Dokumentation selbst nicht erwähnt wird. Per <Files *.html>-Container kann der type-map-Handler auch Dateien mit der Endung .html zugewiesen und der Type-Map-Inhalt (siehe oben) in eine solche geschrieben werden (im Beispiel index.html). Voraussetzung ist, dass keine regulären HTML-Dateien im gleichen Verzeichnis liegen, denn die könnten dann nicht mehr richtig verarbeitet werden. Außerdem sollte die MultiViews-Option abgeschaltet werden. Die .htaccess-Datei enthält also diesen Code:
Beispiel-Code für .htaccess (Variante 2b):
Options -MultiViews
DirectoryIndex index.html
<Files *.html>
SetHandler type-map
</Files>
Bildnachweis: Titelbild von 200 Degrees auf Pixabay