PDF nicht im Browser öffnen (.htaccess)

Veröffentlicht:
Aktualisiert:
Lesezeit:

Für ein Kundenprojekt (zufälligerweise das gleiche wie beim Artikel zum Thema WordPress-Seiten von der internen Suche auszuschliessen) ging es aktuell darum, ein PDF, das zum Download angeboten wird, nicht automatisch von Browsern wie Safari oder Chrome öffnen zu lassen.

Nachteile des automatischen Öffnens einer PDF

Augenscheinlich besitzt das Procedere der unmittelbaren PDF-Anzeige im Browser gewisse Vorzüge, ansonsten hätten die Entwickler von Safari (Preview) und Chrome (Chrome PDF Viewer) diese Funktionalität nicht installiert. Darüber hinaus gibt es auch (externe) Plugins für FireFox wie beispielsweise das PDF Browser Plugin oder die Option, den Adobe Acrobat Reader / Professional (AdobePDFViewer.plugin) dafür zu verwenden.

Dennoch ist das (aus Usability-Sicht) nicht immer das beste Vorgehen. Im vorliegenden Fall geht es um ein kostenpflichtiges PDF, das zum Kauf angeboten wird. Der User landet auf einer bestimmten Seite und bekommt das Ebook dort zum Download angeboten. Und wie immer geht auch dabei die Angst vor dem DAU um…

PDF nicht im Browser öffnen
Den PDF-Download kann man dem Browser beibringen.

Wenn man nämlich die PDF von Safari automatisch geöffnet bekommt und z.B. direkt das erste Kapitel liest und den Browser danach schließt, dann ist die Datei erst einmal „verloren“. Natürlich hätte man das Dokument ganz einfach sichern können („Speichern Unter“), als es offen war (mobile bzw. iOS-Endgeräte: GoodReader App), aber daran denkt man halt nicht intuitiv – und warum sollte man auch?

Das ist schließlich Aufgabe des Betreibers / Webdesigners.

PDF Download erzwingen

Es gibt verschiedene Möglichkeiten, das automatische Öffnen im Browser zu unterbinden und den Download zu erzwingen. Schauen wir uns die Varianten an:

1. application/octet-stream

In der .htaccess kann man über die Angabe AddType application/octet-stream .xyz festlegen, dass der Dateityp mit der Endung .xyz als ausführbare Datei interprestiert werden soll. Als solche muss diese in einem (anderen) Programm geöffnet werden – deshalb umgeht das die eingebauten Öffnungs-Mechanismen von Browser oder Plugin.

Dabei kann man beliebig viele Dateiendungen / -varianten registrieren – einfach pro Zeile eine Endung festlegen.

AddType application/octet-stream .pdf
AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov

Alternativ dazu nutzt man die Lösung von Thingy Ma Jig die eigentlich für die httpd.conf gedacht ist – das funktioniert aber (logischerweise) auch in der .htaccess. Ich habe keine wirklichen Unterschiede feststellen können, einzig die Auflistung mehrerer Dateiendungen dürfte bei dieser Variante einfacher sein.

<FilesMatch '.(?i:pdf)$'>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

2. PHP-Wrapper

Wenn man eine Lösung sucht, die nicht global fungiert und damit aussteuerbar ist, dann kann man zwar auch nur in den entsprechenden Ordnern die .htaccess-Direktive unterbringen. Eine andere Möglichkeit besteht aber auch darin, einen PHP-Wrapper zu verwenden. Das Prinzip funktioniert wie folgt:

A) PHP-Wrapper vorbereiten

Die PHP-Datei folgt der Logik der Content-Header bzw. der Content-Disposition. Dadurch, dass die PHP-Datei separat verlinkt/aufgerufen wird, muss der Browser auch nur für diesen Vorgang die Content-Rules beachten – andere PDFs sind dann nicht davon betroffen.

$file='meine-pdf-datei.pdf';
header('Content-Type: application/pdf');
header('Content-Length: '.filesize($file));
header('Content-Transfer-Encoding: binary'); 
header('Accept-Ranges: bytes');
header('Pragma: no-cache');
header('Expires: 0');  
header('Content-Disposition: attachment; filename='.$file);
readfile('meine-pdf-datei.pdf');

Diese Datei abspeichern (meinedatei.php) und wie gewünscht auf dem Server ablegen (evtl. sinnvoll im Download-Ordner).

ACHTUNG: Chrome scheint bei einem Dateinamen mit Kommasetzung (Meine Datei, PDF.pdf) Probleme zu haben – zur Sicherheit zusammenhängend, lowercased und frei von Satzzeichen agieren…

B) HTML-Link zur PHP-Datei setzen

Jetzt wird statt der PDF die PHP-Datei verlinkt, ergo

<a href="/pfad-zu-meiner-datei/meinedatei.php">Some Text</a>

Für welche Variante haben Sie sich entschieden?

👋 Hallo!

Danke fürs Vorbeischauen & hinterlasse einen Kommentar bei Fragen oder Anregungen.

Falls du Unterstützung für deine Website / dein Projekt brauchst dann sprich mich gern an.

Kontakt aufnehmen

11 Antworten zu “PDF nicht im Browser öffnen (.htaccess)”

  1. Hallo Henning,

    vielen Dank für diese Info, hat mir sehr weiter geholfen. Allerdings funktioniert dieser Code leider nicht im aktuellen Firefox. Hast du eine Idee woran das liegen könnte?

    Gruß aus Lennestadt
    Daniel

  2. Hallo Henning Orth, vielen Dank für diesen sehr nützlichen Beitrag!

    Da Möglichkeit 1 global wirkt, wollte ich gerne Möglichkeit 2 nutzen, da die Webbrowser PDF-Dateien mit 3D Objekten nicht korrekt anzeigen können.

    Die Lösung funktioniert wunderbar. Nur leider zwischenzeitlich nicht mehr in Chrome.

    Vermutlich scheint Chrome zwischenzeitlich Downloads anders zu handhaben.
    Version Version 68.0.3440.106 (Offizieller Build) (32-Bit)

    Die Datei wird automatisch heruntergeladen (ohne die Nachfrage ob sie in einem Programm geöffnet werden soll.)

    Der Download wird in der Leiste unterm Fenster angezeigt. Klickt man dort auf die Datei, wird Sie wiederrum im Browser geöffnet. Nur mit Rechtsklick kann man erreichen, dass sie in einem geeigneten Programm (Acrobat Reader) angezeigt wird.
    Die umständliche Erklärung, was zu tun ist, kann ich den Besuchern der Website nicht zumuten.

    Vielleicht gibt es schon neue Lösungswege? 😉

    • Hallo Julia,

      das ist eine User-seitige bzw. Chrome-spezifische Einstellung, darauf hat man als Betreiber m.W. keinen Einfluss. In den Download-Settings von Chrome lässt sich das anpassen, aber das ist ja für den User wenig hilfreich.

      Da fällt mir aktuell auch kein vernünftiger Workaround ein, sorry…

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert