Wie ist der aktuelle Stand der Dinge, wenn es darum geht, ob dies zu tun ist?
Transfer-Encoding: gzip
oder ein
Content-Encoding: gzip
Wenn ich Clients mit z. B. begrenzter Bandbreite erlauben möchte, ihre Bereitschaft zu signalisieren, eine komprimierte Antwort zu akzeptieren, und der Server das letzte Wort darüber hat, ob er komprimiert oder nicht .
Letzteres ist das, was zB Apaches mod_deflate und IIS tun, wenn Sie es für die Komprimierung sorgen lassen. Abhängig von der Größe des zu komprimierenden Inhalts wird dies zusätzlich ausgeführt Transfer-Encoding: chunked
.
Es wird auch ein enthalten Vary: Accept-Encoding
, das bereits auf das Problem hinweist. Content-Encoding
scheint Teil der Entität zu sein, daher bedeutet das Ändern der Content-Encoding
Beträge zu einer Änderung der Entität, dh ein anderer Accept-Encoding
Header bedeutet, dass beispielsweise ein Cache seine zwischengespeicherte Version der ansonsten identischen Entität nicht verwenden kann.
Gibt es eine eindeutige Antwort darauf, die ich verpasst habe (und die nicht in einer Nachricht in einem langen Thread in einer Apache-Newsgroup vergraben ist)?
Mein aktueller Eindruck ist:
- Transfer-Encoding wäre in der Tat der richtige Weg, um das zu tun, was meistens mit Content-Encoding durch vorhandene Server- und Client-Implementierungen gemacht wird
- Die Inhaltscodierung ist aufgrund ihrer semantischen Auswirkungen mit einigen Problemen verbunden (was sollte der Server tun,
ETag
wenn er eine Antwort transparent komprimiert?). - Der Grund ist Chicken'n'egg: Browser unterstützen es nicht, weil Server dies nicht tun, weil Browser dies nicht tun
Ich gehe also davon aus, dass der richtige Weg ein wäre Transfer-Encoding: gzip
(oder, wenn ich den Körper zusätzlich zerhacke, würde es werden Transfer-Encoding: gzip, chunked
). Und in diesem Fall kein Grund zum Berühren Vary
oder für ETag
einen anderen Header, da es sich um eine Sache auf Transportebene handelt.
Im Moment ist mir das "Hop-by-Hop" -Ness von Transfer-Encoding
etwas nicht so wichtig , worüber sich andere in erster Linie Sorgen zu machen scheinen, da Proxys möglicherweise dekomprimiert und unkomprimiert an den Client weitergeleitet werden. Proxys können es jedoch genauso gut weiterleiten wie es ist (komprimiert), wenn die ursprüngliche Anforderung den richtigen Accept-Encoding
Header hat, was bei allen mir bekannten Browsern eine Selbstverständlichkeit ist.
Übrigens ist dieses Problem mindestens ein Jahrzehnt alt, siehe z . B. https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .
Jede Klarstellung hierzu wird geschätzt. Sowohl in Bezug auf das, was als standardkonform angesehen wird, als auch in Bezug auf das, was als praktisch angesehen wird. Beispielsweise wären HTTP-Client-Bibliotheken, die nur transparente "Content-Encoding" unterstützen, ein Argument gegen die Praktikabilität.
quelle
Transfer-Encoding:gzip
, obwohl das Kommandozeilen-Curl dies nicht tut. Um auf der sicheren Seite zu sein, senden Sie beide, es sei denn, Sie kombinieren Chunked und Gzip.Antworten:
Zitat von Roy T. Fielding , einem der Autoren von RFC 2616:
Quelle: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31
Mit anderen Worten: Do not do on-the-fly Content-Encoding, Verwendung Transfer-Encoding statt!
Bearbeiten: Das heißt, es sei denn, Sie möchten Clients, die nur die Inhaltscodierung verstehen, komprimierten Inhalt bereitstellen . Was leider die meisten von ihnen zu sein scheinen. Beachten Sie jedoch, dass Sie den Bereich der Spezifikation verlassen und möglicherweise auf Probleme wie das von Fielding und anderen erwähnte stoßen, z. B. wenn Caching-Proxys beteiligt sind.
quelle
TE: gzip
. Und dann sollte Ihr Server den Transfer-Encoding-Weg gehen. Wenn der Kunde nur sagtAccept-Encoding: gzip
, müssen Sie esContent-Encoding
so machen. Wenn der Client in seiner Anforderung keine der beiden Angaben macht, darf der Server überhaupt nicht gzip.Die korrekte Verwendung, wie in RFC 2616 definiert und tatsächlich in freier Wildbahn implementiert, besteht darin, dass der Client einen
Accept-Encoding
Anforderungsheader sendet (der Client kann mehrere Codierungen angeben). Der Server kann dann und nur dann die Antwort gemäß den vom Client unterstützten Codierungen codieren (wenn die Dateidaten nicht bereits in dieser Codierung gespeichert sind) und im Antwortheader angeben,Content-Encoding
welche Codierung verwendet wird. Der Client kann dann Daten basierend auf demTransfer-Encoding
(dhchunked
) aus dem Socket lesen und sie dann basierend auf demContent-Encoding
(dh :) dekodierengzip
.In Ihrem Fall würde der Client also einen
Accept-Encoding: gzip
Anforderungsheader senden , und dann könnte der Server entscheiden, (falls nicht bereits) zu komprimieren und einenContent-Encoding: gzip
und optional einen Antwortheader zu sendenTransfer-Encoding: chunked
.Und ja, der
Transfer-Encoding
Header kann in Anforderungen verwendet werden, jedoch nur für HTTP 1.1, was erfordert, dass sowohl Client- als auch Server-Implementierungen diechunked
Codierung in beide Richtungen unterstützen.ETag
Identifiziert die Ressourcendaten auf dem Server eindeutig, nicht die tatsächlich übertragenen Daten. Wenn eine bestimmte URL-Ressource ihrenETag
Wert ändert , bedeutet dies, dass sich die serverseitigen Daten für diese Ressource geändert haben.quelle
Content-Encoding
erfordert unterschiedlich.ETag
Dies ist übrigens der mod_deflate-Fehler, auf den ich in meiner Antwort verweise. Ich frage mich, warum dieses Detail auf Anwendungsebene überhaupt im HTTP-Standard enthalten ist. Wenn SieTransfer-Encoding
jedoch eine Einstellung für die Transportebene verwenden, müssen Sie die nicht ändernETag
. Außer niemand hat Transfer-Enc implementiert.Content-Encoding
vsTransfer-Encoding
. Ja, gzip sollte eine Eigenschaft der Übertragung einer Ressource sein, wenn dies im laufenden Betrieb erfolgt. Wenn die Ressource jedoch komprimiert auf dem Server gespeichert ist, sollte sie stattdessen eine Eigenschaft des Inhalts der Ressource sein, wenn sie unverändert gesendet wird. Aber was sein sollte und was eigentlich ist, ist nicht immer dasselbe.