gz-Dateien kein Download

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • gz-Dateien kein Download

    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?

  • #2
    Was für header werden mitgesendet? Es liegt wohl in 99% der Fällen an den gesendeten Headern, wenn der selbe Browser verwendet wird.

    Kommentar


    • #3
      Im Skript sind gar keine Header gesetzt, es wird einfach nur der Link ausgegeben (mit Headern klappt der Download bei mobilen Browsern nämlich nicht).

      Kommentar


      • #4
        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


        • #5
          Ach so, da bin ich mal gespannt, was dabei herauskommt. Wenn ich den Unterschied gefunden habe, wie kann ich dies ins Skript einbinden? Bei entsprechenden Browser-Headern soll das Skript Gzippen nicht mehr anbieten.

          Kommentar


          • #6
            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
            Wenn du die Header vom Server hast kannst du dir den Unterschied anschauen und bei google suchen wodurch das bewirkt wird und wenn du nichts findest, dann schreib die Header einmal hier ins Forum.

            Kommentar


            • #7
              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


              • #8
                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
                Link 2 (wird angezeigt):
                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
                Wie du siehst ist der Unterschied, welcher dich betrifft der Content-Type.
                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


                • #9
                  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


                  • #10
                    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


                    • #11
                      PHP kann also nirgends erkennen, ob gzip-Dateien downgeloadet oder geöffnet werden.

                      Kommentar


                      • #12
                        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


                        • #13
                          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?
                          Interesting Read: Unsere Regeln | Strings richtig trennen/verbinden |SGA-Tool |Energieverbrauch überwachen | JOINs, das leidige Thema

                          Kommentar


                          • #14
                            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?
                            Naja, mittels Skript kann man schon einiges zum Environment erfahren, z. B. ob der Server unter Windows oder Linux läuft über die Funktion php_uname(). Meine Frage war, ob es eine Funktion oder auch eine Variable gibt, die angeben kann, ob gegzippte Files heruntergeladen oder geöffnet werden und die Antwort ist 'nein'.
                            Zuletzt geändert von weltvolk; 02.01.2009, 17:13.

                            Kommentar


                            • #15
                              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

                              Lädt...
                              X