Tilo Roeder: Binärdateien werden nicht angezeigt

Hallo zusammen,
ich hab folgendes Problem:
auf einem Linux läuft wunderbar ein Apache - alles funktioniert, HTML-datein, Bilder etc. - ein Teil der Dokumente liegen aber auf einem 2003-Server via Samba gemountet - Berechtigung etc ist alles kein Problem - HTML-Dateien, TXT-Dateien etc. werden korrekt angezeigt, Binärdateien (Bilder, pdf, mp3 etc.) jedoch nicht - die Dateien existieren - es werden jedoch 0 Byte übertragen. Die sist nur bei dem smbfs-gemounteten Bereich so.
Die access.log sagt mir nach dem Dokumentnamen immer nur Code 304 statt 200 für ok - die 304 heißt irgendwas mit "Datei nicht geändert, browser soll sie aus dem Cache nehmen"

Aber was soll das, wie kann ich den Fehler beheben?

Gruß Tilo

  1. Hallo,

    auf einem Linux läuft wunderbar ein Apache - alles funktioniert, HTML-datein, Bilder etc. - ein Teil der Dokumente liegen aber auf einem 2003-Server via Samba gemountet - Berechtigung etc ist alles kein Problem - HTML-Dateien, TXT-Dateien etc. werden korrekt angezeigt, Binärdateien (Bilder, pdf, mp3 etc.) jedoch nicht - die Dateien existieren - es werden jedoch 0 Byte übertragen. Die sist nur bei dem smbfs-gemounteten Bereich so.
    Die access.log sagt mir nach dem Dokumentnamen immer nur Code 304 statt 200 für ok - die 304 heißt irgendwas mit "Datei nicht geändert, browser soll sie aus dem Cache nehmen"

    Aber was soll das, wie kann ich den Fehler beheben?

    304 DARF ein Webserver nur verwenden, wenn der Browser ein "Conditional GET" sendet, d.h. ein GET-Request, bei dem If-Modified-Since oder If-None-Match-Header anwesend waren. Was passiert da? Der Browser hat in dem Fall die Datei schonmal angefordert und in dem Zusammenhang ein Last-Modified-Datum oder einen ETag bekommen. Und diese Daten steckt er dann in die entsprechenden If-Header. Erkennt der Webserver, dass das noch aktuell ist, gibt er dem Browser die Antwort 304 zurück, d.h. "Du brauchst das nicht nochmal runterladen". Wenn der Webserver erkennt "oh, da hat sich etwas geändert", dann sind die Daten offensichtlich nicht mehr aktuell.

    Auf eine Anfrage OHNE If-None-Match oder If-Modified-Since DARF ein Webserver keinen Statuscode 304 liefern. Wenn er es doch tut, ist'S ein Bug. Mir ist allerdings noch kein Webserver begegnet, der so verbuggt wäre (und der Apache macht's definitiv richtig).

    Was bei Dir genau für ein Fehler auftritt, kann ich Dir leider nicht sagen. Hast Du mal probiert, Deinen Browsercache zu leeren, um derartige Effekt auszuschließen? Ist zwischen Browser und Webserver evtl. noch ein Proxy? Was passiert, wenn Du auf der Linux-Kiste per »cp« auf der Kommandozeile eine Bild-Datei mal ins lokale Dateisystem kopierst - kommt die korrekt an?

    Viele Grüße,
    Christian

    1. Hallo Christian,
      ich habs durch Zufall gefunden - es scheint wirklich ein Bug zu sein die 304 zu senden, denn:

      • Datei mit cp ins lokale Verzeichnis kopiert - un des funktioniert
      • Datei im smbfs-mount mit touch nen neuen Zeitstempel verpaßt - unverändert
      • Browsercache geleert - kein Erfolg
      • verschiedenste Browser getestet - auch wget und lynx - Fehlanzeige

      Aber in der Apache-conf folgende Parameter gefunden, geändert und es klappt :-)

      EnableMMAP: Control whether memory-mapping is used to deliver

      files (assuming that the underlying OS supports it).

      The default is on; turn this off if you serve from NFS-mounted

      filesystems.  On some systems, turning it off (regardless of

      filesystem) can improve performance; for details, please see

      http://httpd.apache.org/docs-2.2/mod/core.html#enablemmap

      EnableMMAP off

      EnableSendfile: Control whether the sendfile kernel support is

      used  to deliver files (assuming that the OS supports it).

      The default is on; turn this off if you serve from NFS-mounted

      filesystems.  Please see

      http://httpd.apache.org/docs-2.2/mod/core.html#enablesendfile

      EnableSendfile off

      Gruß und Dank,
      Tilo