+34 687 770 998 hector.ayestaran@gmail.com





Blog


22
ABR
2016

Apache: Cómo forzar una descarga sin programación con un nombre de archivo diferente

Las descargas de archivos implementadas mediante programación de servidor, ya sea PHP, JSP, etc, son engorrosas, consumen recursos y dan problemas. Lo más limpio es hacerlo mediante la configuración del servidor web, en este caso Apache.

Veremos cómo hacerlo pasándo al servidor el nombre defintivo del archivo (el que aparecerá en el diálogo de descarga) a través de un parámetro en la URL. Los archivos a descargar se ubicarán en un directorio concreto y siempre que sean solicitados por el navegador Apache forzará la descarga.

El código definitivo es el siguiente. No debe escribirse en un .htaccess, si no en un fichero .conf, a ser posible del dominio en cuestión, no en el general de Apache. Para ello necesitaremos acceso al shell del servidor, con lo que en un alojamiento compartido probablemente no se podrá hacer.
Si vemos un bloque VirtualHost allá dónde vayamos a implementar el código, deberá ser dentro de este bloque donde lo hagamos, siempre y cuando dicha directiva corresponda con el servicio (puerto, IP) con el que trabajamos.


RewriteMap unescape int:unescape

<DirectoryMatch "/descargas/">

	<Files "*.*">
		 RewriteEngine On
		 RewriteBase /

		 RewriteCond %{QUERY_STRING} ^(.+)$
		 RewriteRule ^ - [E=NOMBRE_DESCARGA:${unescape:%1|%1}]

		 Header add Content-Disposition 'attachment; filename="%{NOMBRE_DESCARGA}e"'
	</Files>

</DirectoryMatch>

Vemos que en la primera línea declaramos la función interna unescape. La necesitaremos para decodificar los caracteres escapeados que nos llegarán desde el navegador.

Posteriormente utilizamos las directivas DirectoryMatch y Files para designar el objetivo a descargar.

Finalmente utilizamos RewriteCond para capturar los parámetro de la URL, y mediante RewriteRule asignamos dicho valor (%1) a una variable de entorno: NOMBRE_DESCARGA, tras haberlo decodificado con unescape.
Los argumentos ^ - de RewriteRule harán que la URL permanezca inalterable durante el proceso.

La cabecera HTTP Content-Disposition indicará al navegador que el fichero debe descargarse en vez de mostrarse, y que debe hacere con el nombre de archivo recogido por la variable NOMBRE_DESCARGA.


Volver