Ich habe ein seltsames Problem mit meinem 64-Bit-PC mit Windows 7 bei der Arbeit. Ich verwalte einige Linux-Webserver, die gzippte Inhalte (JS, CSS, HTML) bereitstellen. Das seltsame Verhalten besteht darin, dass alle Browser in meinem System (Firefox, Chrome, Vivaldi), die Inhalte von diesen Linux-Servern anfordern (ich kann den Accept-Encoding: gzip,deflate
Header problemlos sehen), diese aber nicht erhalten. Alle Antworten kommen mit , sodass der Inhalt nicht komprimiert bereitgestellt wird. Wenn Sie die Option jedoch in der Befehlszeile Transfer-Encoding: chunked
ausführen , kommt die Antwort mit und Headern und wird wie vorgesehen gzippt. Von einem Windows 2008 R2-Server wird der Inhalt gzippt bereitgestellt.curl
--compressed
Content-Type: gzip
Content-Length
Die Bereitstellung des Inhalts im gzip-Format funktioniert auf diesen Linux-Webservern garantiert problemlos.
Es ist ein pfSense-Proxy beteiligt, aber selbst wenn ich ihn in den Proxy-Einstellungen überschreibe, sodass der Browser den Inhalt direkt von den Linux-Servern anfordert, ist das Verhalten dasselbe. Keine Änderung, mit oder ohne Proxy.
Ich habe das Problem mit Firefox und Chrome auf einem anderen 64-Bit-PC mit Windows 7 bestätigt. Daher komme ich zu dem Schluss, dass das Betriebssystem irgendwie an diesem seltsamen Browserverhalten beteiligt ist.
Kann das jemand bestätigen...?
Antwort1
Dies kann irreführend sein: Um die gzippte Datei in einer Nachricht zu senden, muss der Server über die gesamte Datei verfügen und ihre Größe kennen, was in Ihrem Fall anscheinend nicht der Fall ist, wie Sie selbst sagten:
Wenn Sie curl in der Befehlszeile mit der
--compressed
Option ausführen, enthält die AntwortContent-Type: gzip
HeaderContent-Length
und ist wie vorgesehen gzippt.
Ich denke, dass in Ihrem Fall der ServerRohredie Ausgabe an gzip und leitet das Ergebnis dann direkt an den Browser weiter, ohne die Daten zuerst auf die Festplatte zu schreiben, um die Dateigröße zu berechnen. Da der Server die Größe nicht im Voraus kennt, hat er keine andere Wahl, als einen Stream mit Transfer-Encoding: chunked
so vielen Teilen zurückzugeben, wie verfügbar sind.
Sobald Daten verfügbar sind, werden sie in Blöcken zurückgegeben und vom Browser wieder zusammengesetzt. Die empfangenen Daten werden jedoch trotzdem gzippt, auch wenn sie in Blöcken empfangen werden.