Author: Michael Schröpl
Description: Eine Zusammenfassung des Verfahrens zur Auslieferung komprimierter Seiteninhalte in HTTP
Keywords: Apache, HTTP, Kodierung, gzip, Komprimierung

# Komprimierung von HTTP-Inhalten durch Content-Encoding

## Kommunikation in HTTP

Für die Übertragung von Web-Inhalten zwischen Server und Client wird das Hypertext Transfer Protocol (HTTP) verwendet.

Die Kommunikation läuft dabei folgendermaßen ab:

1. Der Client sendet eine Anforderung an den Server. Diese Anforderung besteht hauptsächlich aus HTTP-Headern, die beschreiben, welche Daten der Client empfangen möchte.
   In einem gewissen Maße hat der Client die Möglichkeit, den Inhalt der Daten direkt zu beeinflussen (etwa durch den URL der angeforderten Seite); andere Teile seiner Anforderung liefern dem Server zusätzliche Informationen darüber, welche Art von Daten der Client bevorzugt empfangen möchte, falls der Server mehrere Variationen der Daten anzubieten hat.
2. Der Server wertet alle ihm vorliegenden Informationen aus, um zu entscheiden, welche Daten in welcher Darstellungsform angefordert wurden, und versucht anschließend, diese Daten in einer der Anforderung des Clients möglichst gut entsprechenden Form auszuliefern.
   Auch dieses Datenpaket enthält wiederum HTTP-Header, vor allem aber Daten - welche allerdings ohne die Berücksichtigung der HTTP-Header nur teilweise interpretierbar sein können.

Der zweite Aspekt der Bestimmung des erwünschten Inhalts wird in allgemeiner Form als Content Negotiation bezeichnet. Auch die Auslieferung komprimierter Seiteninhalte in der hier beschriebenen Form basiert auf diesem allgemeinen Prinzip.

## Kodierungen in HTTP

HTTP 1.1 definiert im Kapitel 3.5. sogenannte Inhalts-Kodierungen, die jeder diesem Standard entsprechende Browser unterstützen sollte.

Für die Kommunikation zwischen Server und Client haben diese Kodierungen folgende Bedeutung:

1. Der Client darf im HTTP-Header `Accept-Encoding:` eine Liste der von ihm akzeptierten Inhalts-Kodierungen angeben. Die besondere Kodierung `identity` (welche eine Codierung beschreibt, die den Inhalt nicht verändert) wird dabei implizit als Standardwert angenommen.
2. Der Server sollte den Inhalt des angeforderten Dokuments in einer Kodierung ausliefern, welche dieser Client akzeptiert.
   Ist dies dem Server nicht möglich, dann sollte er die Anforderung mit dem Status-Code `406 Not Acceptable` zurückweisen; er darf aber auch Inhalte ausliefern, die der Client laut seiner Anforderung nicht akzeptieren wird (und deren Verarbeitung den Client vor unlösbare Probleme stellen könnte).
   Der Apache-Webserver verwendet in dieser Hinsicht eine defensive Strategie: Falls er eine Seite nicht gemäß der Anforderungen des Clients ausliefern kann, aber andere Varianten zur Auswahl hat, dann generiert er dynamisch ein HTML-Dokument mit einer kurzen Beschreibung der Sachlage und Verweisen auf alle in Frage kommenden Dokumente. (Dies ist auch der Fall, wenn dieses Dokument hier von einem Browser angefordert wird, der gemäß seiner aktuellen Konfiguration keine der von mir unterstützten Sprachen `de` und `en` akzeptiert; ich habe bewußt keinen Default-Wert gesetzt, um fremdsprachigen Lesern dieser Seiten diese Problematik bewußt zu machen.)

Liefert ein Server eine derartig kodierte Datei an einen Client aus, der das nicht versteht, dann wird der Client sie möglicherweise nicht korrekt verarbeiten können.

(Michael Schröpl, 2002-07-12)