PDF inline => diverse Header-Probleme

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

  • PDF inline => diverse Header-Probleme

    Hallo zusammen,

    ich bin jetzt seit eineinhalb Tagen erfolglos auf der Suche nach einer Lösung für mein Problem und schließlich auf diese Seite gestoßen. Danke erstmal an die Betreiber für diese Plattform, und vielleicht weiß ja auch jemand eine Lösung für mich.

    Was ich will: in einem geschützten Mitgliederbereich sollen angemeldeten Benutzern Dokumente mit sensiblen Daten zur Verfügung gestellt werden. Diese Dokumente liegen in einem per .htaccess geschützten Verzeichnis und werden per PHP durchgereicht. Mein zugehöriges Skript (schickt die Datei per "Content-disposition: inline;" an den Client) funktioniert wunderbar mit allen Browsern, die ich unterstützen möchte.

    Die Probleme traten nun auf, als ich per Session-Handling sicherstellen wollte, dass der zugreifende Benutzer auch wirklich korrekt angemeldet ist. Das Starten der Session per

    PHP-Code:
    session_start(); 
    führte dazu, dass der Internet Explorer (6.0.2900.2180) die PDF-Dateien nicht mehr im Browser anzeigt. Stattdessen erscheint eine Meldung, die das Speichern der Datei anbietet (direktes Öffnen nicht), allerdings mit dem Hinweis "The file you are downloading cannot be opened by the default program. It is either corrupted or it has an incorrect file type." Weiters wird empfohlen, aus Sicherheitsgründen den Download abzubrechen. Nicht sehr schön und für den DAU auch abschreckend.

    Nach langer Suche habe ich den Tipp gefunden, vor dem Start der Session den session_cache_limiter manuell zu setzen (Default-Wert bei meinem Server: nocache).

    PHP-Code:
    session_cache_limiter('public');
    session_start(); 
    Damit funktioniert es tatsächlich auch im Internet Explorer wieder (wobei mein Wissen für eine Erklärung hierfür nicht ausreicht...). Nun ergibt sich aber ein ganz anderes Problem. Aus offensichtlichen Gründen möchte ich kein Cachen dieser Dateien. Die Computer werden von mehreren Personen benutzt. Mit der obigen Lösung ist es möglich, die zuvor angezeigten Dateien einfach über die History des Browsers erneut anzuzeigen, auch nachdem man sich abgemeldet hat. Mein Skript (das den Zugriff in diesem Fall eigentlich korrekt verweigert) wird nicht ausgeführt.

    Nun habe ich erst damit begonnen, mit verschiedenen Werten für den Aufruf von session_cache_limiter() zu spielen, ohne Erfolg. Dann habe ich versucht, verschiedene Header mitzuschicken, die das Cachen verbieten, z.B. (die letzten beiden Zeilen):

    PHP-Code:
    header("Content-Type: application/pdf");
    header("Content-Length: $len");
    header("Content-transfer-encoding: binary");
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
    Das führt aber leider wieder dazu, dass der IE die Datei nicht im Browser anzeigt. Durch Ändern der Reihenfolge und andere Varianten wurde es sogar noch schlimmer (=> Firefox zeigt die Dateien im Quelltext an, trotz transfer encoding "binary" etc.).

    So langsam bin ich mit meinem Latein am Ende. Sollte jemand noch eine Lösung wissen oder Tipps für mich haben, wäre ich für jede Antwort sehr dankbar.

  • #2
    Inzwischen bin ich ein Stückchen weiter. Der Internet Explorer stört sich scheinbar (nur in diesem Zusammenhang, ich habe das früher schon öfter erfolgreich benutzt) an diesem Aufruf:

    PHP-Code:
    header("Cache-Control: no-cache, must-revalidate"); 
    Entfernt man "no-cache", behauptet auch der IE nicht mehr, die Datei sei korrupt. Ich mag solche Lösungen zwar überhaupt nicht, aber das hilft:

    PHP-Code:
    if (strpos($HTTP_SERVER_VARS["HTTP_USER_AGENT"], "MSIE"))
    {
        
    header("Cache-Control: must-revalidate");
    }
    else
    {
        
    header("Cache-Control: no-cache, must-revalidate");

    Blieb das Problem mit dem Ansehen der Dateien, ohne angemeldet zu sein. Die momentane Lösung hierzu sieht so aus: wenn ich den "Expires"-Header statt mit einem Datum aus der Vergangenheit jeweils mit dem aktuellen Datum füttere...

    PHP-Code:
    header("Expires: " date("r")); 
    Ruft der IE das Skript wenigstens dann neu auf, wenn der Browser zuvor geschlossen wurde (unabhängig von den lokalen Cache-Einstellungen) - damit kann ich leben. Mir ist ja klar, dass man die Dateien so oder so abgreifen könnte, wenn man nur wollte (temporäre lokale Kopien), aber ich wollte eben verhindern, dass der durchschnittliche DAU zufällig darüber stolpert (Arbeiten am gleichen Rechner, "seltsame" Bookmarks etc.).

    Sollte jemandem noch eine bessere Lösung einfallen...

    Kommentar

    Lädt...
    X