Wie kann es sein, dass ein und dieselbe gz-Datei beim Aufruf über HTTP auf dem einen Server heruntergeladen wird, auf dem anderen aber einfach im Browser geöffnet wird? Kann man den Grund dafür in der PHP-Konfiguration festmachen?
gz-Dateien kein Download
Einklappen
X
-
Ich meine: welche Header empfangt der Browser?
Bei jeder HTTP Übertragung wird als erstes ein Header gesendet.
Es ist nicht nötig, dass man diese Header manuell setzt, das wird unter anderem durch Apache, wen du Apache benutzt oder was auch immer gesendet. Auch bei verschiedenen PHP-Einstellungen werden automatisch Header mitgesendet.Lies einmal die gesendeten Header aus, z.B. mit firebug beim firefox oder manuell mit java, c oder was immer du willst. Wenn du dich nicht mit Programmieren auskennst ist es aber wohl am einfachsten den Firefox mit dem Plugin Firebg zu benutzen.
Kommentar
-
Ob der Browser gzip erlaubt sendet er ebenfalls im Header bei seiner Anfrage mit.
Hier einmal ein Beispiel des gesendeten und des empfangenen headers:Code:Response Headers Date Thu, 01 Jan 2009 19:18:58 GMT Server Apache/2.2.3 (Debian) mod_ssl/2.2.3 OpenSSL/0.9.8c X-Powered-By PHP/5.2.6-0.dotdeb.1 Keep-Alive timeout=15, max=100 Connection Keep-Alive Transfer-Encoding chunked Content-Type text/plain Request Headers Host XXX.ch User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Accept */* Accept-Language en-gb,en;q=0.5 Accept-Encoding gzip,deflate // hier sind die erlaubten encodierungen, welche vom Browser im Header mitgesendet werden Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 300 Connection keep-alive Referer XXX Cookie PHPSESSID=6fce3e6ba5edcb7438dd7e6598151756
Kommentar
-
Habe Folgendes gefunden:
HTTP Request Headers
Accept-Encoding: gzip, deflate, x-zip, identity; q=0.9
HTTP Response Headers
Transfer-Encoding: chunked
Mein Browser unterstützt demnach gzip, heißt "chunked", dass der Server gzip-Dateien herunterlädt und nicht öffnet? Habe 2 Links derselben Datei auf je einem anderen Server:
da.gif.gz wird heruntergeladen (s. o. HTTP Response Headers)
da.gif.gz wird als gif-Datei geöffnet, was natürlich scheitert (keine HTTP Response Headers ermittelt)
Kommentar
-
Jetzt noch die Response-Headers der beiden Links:
Link 1 (wird heruntergeladen):Code:HTTP/1.1 200 OK Date: Thu, 01 Jan 2009 21:46:54 GMT Server: Apache Vary: Host Last-Modified: Thu, 01 Jan 2009 20:19:53 GMT ETag: "4b08fc01-79-45f718c156c40" Accept-Ranges: bytes Content-Length: 121 Connection: close Content-Type: application/x-gzip
Code:HTTP/1.1 200 OK Date: Thu, 01 Jan 2009 21:53:09 GMT Server: Apache Set-Cookie: Apache=80.190.144.123.300671230846789561; path=/ Last-Modified: Thu, 01 Jan 2009 20:43:34 GMT ETag: "4b5c6bf-79-495d2af6" Accept-Ranges: bytes Content-Length: 121 Connection: close Content-Type: image/gif
Bei lycos wird die Datei als Bild erkannt (da wahrscheinlich der Header der Datei ausgelesen wird oder evtl. da .gif in der Datei vorkommt; keine Ahnung was lycos betrifft, denn das ist ihre interne Angelegenheit; du könntest es ja ausprobieren --> Datei wird als Gif deklariert).
Bei weltvolk.de wird der Dateityp über die Dateiendung erkannt und als gzip Datei erkannt (type application/x-gzip).
Nun hat dein Browser die Einstellung (lässt sich bei manchen Browsern sogar manuell einstellen), dass Dateien mit dem Mimetype image/gif im Browser selbst angezeigt werden, da es Bilder sind und der selbe Browser hat die Einstellung, dass Dateien mit dem Mimetype application/x-gzip einen Download-Dialog auslösen.
Ich weiss jetzt nicht, ob du nun noch ein Problem hast oder ob das nur eine allgemeine Frage war. Wenn du noch ein Problem haben solltest schreib einfach. Am einfachstenund sinnvollsten wäre es den Header über Apache zu ändern, wenn du das möchtest.
[EDIT]
PS: Transfer-Encoding: chunked hat mit deinem Problem nicht viel zu tun. Das ist eine Übertragungsart für den Fall, dass nicht die ganzen Daten in einem Stück, sondern in chunks geschickt werden sollen. Dabei wird immer zuerst die Länge des nächsten chunks in Form zweier Hex-Ziffern geschickt und danach das nächste Stück.Zuletzt geändert von jmc; 01.01.2009, 23:10.
Kommentar
-
Alles klar, jetzt muss ich nur noch wissen, wie das PHP-Skript erkennt, ob gz-Dateien heruntergeladen werden würden oder nicht. Gzip soll ja nur möglich sein, wenn auch der Download funktioniert. PHP müsste den Content-Type erkennen und wenn dieser "application/x-gzip" nicht enthält, eine Meldung ausgeben. Wie gesagt funktionieren im Skript definierte Header nicht bei Handybrowsern, da aufgerufene gz-Dateien durch PHP-Header leider immer angezeigt werden (auch da, wo normalerweise ein Download erfolgt).
Kommentar
-
Ein PHP-Script scheint da gar nicht involviert zu sein. Die URLs zeigen zumindest direkt auf .gz-Dateien und wenn du nicht mit mod_rewrite zauberst, ist PHP überhaupt nicht beteiligt. Suche in der Apache-Konfiguration nach AddType-Direktiven und lies in der Apache-Doku nach, was es damit auf sich hat.
Kommentar
-
PHP hat wie onemorenerd in deinem Fall nicht viel damit zu tun, ausser du sorgst ausdrücklich darum. Es liegt an deinem Apache Server. Du könntest es aber als PHP-Datei behandeln lassen oder auch die Datei über eine PHP-Datei umgelenkt downloaden lassen.
Es sind keine PHP-Header, aber du hast auch mit PHP die Möglichkeit die Header zu bestimmen.
Sendet den Mimetype nicht, sondern dein Server. Du hast aber die Möglichkeit bei einer PHP-Datei diesen Typ ausdrücklich zu überschreiben.
Kommentar
-
Original geschrieben von TobiaZ
Wenn PHP nicht angesprochen wird, natürlich nicht.
Stell dir vor, du sitzt hier in deinem Haus. Bekommst du dann mit, wenn in China ein Sack Reis umfällt?Zuletzt geändert von weltvolk; 02.01.2009, 17:13.
Kommentar
-
Diese Funktion kann es gar nicht geben, denn das wird nicht durch PHP behandelt sondern durch den jeweiligen Browser.
Jedoch gibt es eine Möglichkeit (den Header) den Browser mitzuteilen, welche Art von Dateien sie, wenn sie sich nach dem Standard richten, erhalten. Dazu gibt es auch Standardverhalten bei diesen bestimmten Dateitypen.
Z.B. Gif-Bilder werden praktisch bei allen Browsern direkt angezeigt. Das ist jedoch kein muss, sie könnten auch zu einem Download-Dialog führen oder direkt gedownloadet werden oder was auch immer.
Mit dem Header kannst du auch versuchen eine Windows-Anwendung als Bild anzeigen zu lassen.
Es gibt ausserdem so viele Kompressionsarten... wie soll denn der Server erkennen sollen ob es sich um eine gezippte Version handelt. Bei einer Zip-Kompression geht das gerade noch, da die auch schon beinahe standard ist und deren Header bekannt sind, aber normalerweise wird einfach standardmässig durch den Server der Dateiendung X der Mimetype Y zugeordnet, das kannst du aber auch abändern.
Um den Mimetype einer Datei auszulesen gibt es tatsächlich Möglichkeiten mit PHP, z.B. Fileinfo
Ob die Datei bei diesem Mimetype aber dann gedownloadet wird oder nicht kann PHP unmöglich erkennen, da dies vom Client abhängt. Es gibt jedoch einige Mimetypes, bei denen man tendentiell sicher sein kann, dass sie runtergeladen werden. Dazu gehören die meisten application/...
Kommentar
Kommentar