¿Cómo enviar encabezados Content-Disposition en apache para archivos?

8

Tengo un directorio de archivos de texto que estoy entregando con apache 2. Normalmente cuando yo (o cualquier usuario) accedo a los archivos, los ven en su navegador. Quiero 'forzar' * el navegador web para que aparezca un cuadro de diálogo 'Guardar como'. Sé que esto es posible hacer con los Content-Dispositionencabezados ( más información ).

¿Hay alguna forma de activar eso para cada archivo?

Idealmente me gustaría algo como esto:

<Directory textfiles>
   AutoAddContentDispositionHeaders On
</Directory>

Y luego apache establecería el encabezado de disposición de contenido correcto, incluido el uso del mismo nombre de archivo.

Algo así podría ser posible con la Headerdirectiva apache .

Puntos de bonificación si se incluye al estar en apache en debian.

Podría hacer una secuencia de comandos de contenedor PHP simple que tome un filenameargumento, realice la llamada header(...)y luego imprima el archivo, pero luego tengo que validar la entrada de entrada, etc. Eso es un trabajo que estoy tratando de evitar.


* Sé que no puedes forzar las cosas cuando se trata de la web

Rory
fuente

Respuestas:

11

He descubierto que esto hace lo que quiero:

<Location /textfiles>
    SetEnvIf Request_URI "^.*/([^/]*)$" FILENAME=$1
    Header set "Content-disposition" "attachment; filename=%{FILENAME}e"
    UnsetEnv FILENAME
</Location>
Rory
fuente
¿Para qué sirve la "e" al final del nombre del archivo? Veo que no funciona sin él, pero no entiendo lo que hace.
Mark E. Haase
Simplemente significa "el contenido de la variable de entorno denominada FILENAME" (consulte la documentación de mod_headers: httpd.apache.org/docs/current/mod/mod_headers.html )
Ale
1

mod_headers debe ser lo que buscas:

<IfModule mod_headers.c> 
  <Location ~ ".*/textfiles/.*"> 
    Header set Content-Disposition attachment
  </Location>
</IfModule>
cristiano
fuente
Un buen comienzo, pero también quiero el nombre de archivo allí para que aparezca el (mismo) nombre de archivo. Sin embargo, he encontrado una solución similar
Rory el