Wie sende ich Content-Disposition-Header in Apache für Dateien?

8

Ich habe ein Verzeichnis mit Textdateien, die ich mit Apache 2 bereitstelle. Wenn ich (oder ein Benutzer) auf die Dateien zugreife, werden sie normalerweise in ihrem Browser angezeigt. Ich möchte den Webbrowser zwingen, ein Dialogfeld zum Speichern unter zu öffnen. Ich weiß, dass dies mit den Content-DispositionHeadern möglich ist ( weitere Informationen ).

Gibt es eine Möglichkeit, dies für jede Datei zu aktivieren?

Idealerweise möchte ich so etwas:

<Directory textfiles>
   AutoAddContentDispositionHeaders On
</Directory>

Und dann würde Apache den richtigen Header für die Inhaltsdisposition festlegen, einschließlich der Verwendung desselben Dateinamens.

So etwas könnte mit der Apache- HeaderDirektive möglich sein.

Bonuspunkte, wenn es in Debache in Apache steht.

Ich könnte ein einfaches PHP-Wrapper-Skript erstellen, das ein filenameArgument aufnimmt , header(...)die Datei aufruft und dann druckt, aber dann muss ich Eingaben usw. validieren. Das ist Arbeit, die ich zu vermeiden versuche.


* Ich weiß, dass man im Web eigentlich nichts erzwingen kann

Rory
quelle

Antworten:

11

Ich habe festgestellt, dass dies tut, was ich will:

<Location /textfiles>
    SetEnvIf Request_URI "^.*/([^/]*)$" FILENAME=$1
    Header set "Content-disposition" "attachment; filename=%{FILENAME}e"
    UnsetEnv FILENAME
</Location>
Rory
quelle
Wofür steht das "e" am Ende des Dateinamens? Ich sehe, dass es ohne es nicht funktioniert, aber ich verstehe nicht, was es tut.
Mark E. Haase
Es bedeutet nur "den Inhalt der benannten Umgebungsvariablen FILENAME" (siehe Dokumentation von mod_headers: httpd.apache.org/docs/current/mod/mod_headers.html )
Ale
1

mod_headers sollte das sein, wonach Sie suchen:

<IfModule mod_headers.c> 
  <Location ~ ".*/textfiles/.*"> 
    Header set Content-Disposition attachment
  </Location>
</IfModule>
Christian
quelle
Ein guter Anfang, aber ich möchte auch den Dateinamen dort, damit der (gleiche) Dateiname angezeigt wird. Ich habe jedoch eine ähnliche Lösung gefunden
Rory