Comment envoyer des en-têtes Content-Disposition dans Apache pour les fichiers?

8

J'ai un répertoire de fichiers texte que je sers avec apache 2. Normalement, lorsque j'accède (ou à n'importe quel utilisateur) aux fichiers, ils les voient dans leur navigateur. Je souhaite «forcer» * le navigateur Web à afficher une boîte de dialogue «Enregistrer sous». Je sais que c'est possible avec les en- Content-Dispositiontêtes ( plus d'infos ).

Existe-t-il un moyen d'activer cela pour chaque fichier?

Idéalement, je voudrais quelque chose comme ça:

<Directory textfiles>
   AutoAddContentDispositionHeaders On
</Directory>

Et puis apache définirait l'en-tête de disposition de contenu correct, y compris en utilisant le même nom de fichier.

Quelque chose comme ça pourrait être possible avec la Headerdirective apache .

Points bonus s'il est inclus en se tenant dans apache dans debian.

Je pourrais faire un simple script wrapper PHP qui prend un filenameargument, appelle header(...)et imprime le fichier, mais je dois valider l'entrée, etc., c'est un travail que j'essaie d'éviter.


* Je sais que vous ne pouvez pas forcer les choses en ce qui concerne le Web

Rory
la source

Réponses:

11

J'ai découvert que cela fait ce que je veux:

<Location /textfiles>
    SetEnvIf Request_URI "^.*/([^/]*)$" FILENAME=$1
    Header set "Content-disposition" "attachment; filename=%{FILENAME}e"
    UnsetEnv FILENAME
</Location>
Rory
la source
À quoi sert le «e» à la fin du nom de fichier? Je vois que ça ne marche pas sans ça, mais je ne comprends pas ce que ça fait.
Mark E. Haase
Cela signifie simplement "le contenu de la variable d'environnement nommée FILENAME" (voir la documentation de mod_headers: httpd.apache.org/docs/current/mod/mod_headers.html )
Ale
1

mod_headers devrait être ce que vous recherchez:

<IfModule mod_headers.c> 
  <Location ~ ".*/textfiles/.*"> 
    Header set Content-Disposition attachment
  </Location>
</IfModule>
Christian
la source
Un bon début, mais je veux aussi le nom de fichier là-dedans pour qu'il apparaisse le (même) nom de fichier. Cependant, j'ai trouvé une solution similaire
Rory