Habremos visto muchas veces sitios web que al acceder muestran una serie de ficheros y carpetas, como si de un navegador de archivos se tratara, pero vía web. Esta forma de mostrar los datos en un servidor web con Apache es muy sencilla y es la que explicamos en este artículo. Este método se denomina indexación (indexing).

Introducción

.htaccess es un archivo de texto plano, oculto, que contiene una serie de directivas para el servidor Apache. Cuando un cliente solicita un archivo al servidor, este busca desde el directorio raíz hasta el subdirectorio que contiene el archivo solicitado el archivo .htaccess y tiene en cuenta estas reglas antes de proceder con la petición, es decir, se aplican las normas especificadas al directorio en el que se encuentre .htaccess y los directorios por debajo de él.

Lo que vamos a explicar sólo servirá para servidores web con Apache. Su utilidad es bastante interesante, por ejemplo, para crear un directorio con ficheros para descarga directa, dando acceso a estos ficheros sólo a determinados usuarios.

También servirá para mostrar el contenido de una carpeta y dejarlo disponible para todos los usuarios (público), para que puedan realizar descargas directas

El listado del que hablamos quedará de esta forma, una vez configurado el fichero .htaccess correctamente:

Vista de zona de página web en modo exploración de archivos y directorios

El usuario de nuestro sitio web podrá pulsar en cualquiera de los ficheros de la carpeta pública y descargarlo. También se podrán crear subdirectorios y el usuario podrá navegar en ellos como si de un explorador de ficheros se tratara.

El fichero .htaccess se puede utilizar para muchas otras cosas, por ejemplo para hacer un redirección o para impedir que se «vea» el contenido de una carpeta de nuestro sitio web (cuando no tiene fichero de índice index.html, o index.php).

Un ejemplo sencillo de fichero .htaccess

En el fichero .htaccess podremos indicar todas las opciones de configuración que deseemos para el directorio que queramos hacer público o privado. Para ello crearemos un fichero con este nombre .htaccess (incluyendo el punto del principio). Este fichero es de texto plano, por lo que se podrá crear con el bloc de notas o cualquier otro editor de texto plano (sin formato).

En nuestro caso, puesto que tenemos nuestro servidor web Apache alojado en Linux, abriremos una ventana de terminal y utilizaremos el editor vi para crear el fichero .htaccess:

En nuestro caso, accederemos a la carpeta raíz de nuestro sitio web:

cd /apache/web/www

Para crear el directorio (siempre dentro de nuestro directorio raíz del sitio web):

mkdir publico

Accederemos a este directorio:

cd publico

Con el editor vi, crearemos el fichero .htaccess:

vi .htaccess

Escribiremos el contenido del fichero .htaccess:

Creando el fichero .htaccess con vi

Para hacer público el contenido de la carpeta «publico» de nuestro sitio web, permitiendo que cualquier usuario pueda navegar y descargar los ficheros que contenga, introduciremos el siguiente contenido:

Order deny,allow
Satisfy Any
IndexOptions +FancyIndexing
IndexOptions -SuppressDescription
IndexOptions -ScanHTMLTitles
IndexOptions +SuppressHTMLPreamble
IndexOptions +SuppressLastModified
IndexIgnore *.rar *.php
Options +Indexes

Donde:

  • Order deny,allow: indicamos con este parámetro que todas las IPs tendrán acceso a la carpeta. Si quisiéramos, por ejemplo, que varias IPs no tuvieran acceso a la carpeta, utilizaríamos:

order deny,allow
deny from IP_1
deny from IP_2

allow from all

Si quisiéramos que sólo se tuviera acceso a la carpeta desde nuestra red local (LAN) utilizaríamos:

order deny,allow
deny from all
allow from 192.168.1.0/24

(suponiendo que nuestra red local es del tipo 192.168.1.xxx)

  • Satisfy Any: esta directiva sólo es útil si se quiere restringir el acceso a una determinada carpeta o fichero.
  • IndexOptions +FancyIndexing: mostrará una lista detallada de los ficheros de la carpeta (nombre, tamaño, fecha modificación, etc). Para desactivar esta opción utilizaremos -FancyIndexing.
  • IndexOptions -SuppressDescription: indicamos con esta directiva que queremos que aparezca la columna de «Description» (descripción) en el listado de ficheros.
  • IndexOptions -ScanHTMLTitles: con esta directiva indicamos a Apache que no obtenga el título de los ficheros HTML del directorio. Si quisiéramos que lo obtuviera utilizaríamos +ScanHTMLTitles.
  • IndexOptions +SuppressHTMLPreamble: indicamos que no se acceda a intentar obtener los daqtos del fichero HTML contenidos entre las etiquetas HEAD. Para que Apache intente obtener esta información de los ficheros HTML introduciremos -SuppressHTMLPreamble.
  • IndexOptions +SuppressLastModified: indicamos con esta directiva que no se muestre la columna «Fecha de modificación del fichero». Para mostrar esta columna utilizaremos -SuppressLastModified.
  • IndexIgnore comodines: si queremos que determinados ficheros no aparezcan en el listado, podemos utilizar la directiva «IndexIgnore». En el ejemplo anterior, con la directiva IndexIgnore *.rar *.php indicamos que no aparezcan los ficheros .rar ni los .php, utilizaremos.
  • Options +Indexes: con esta directiva indicamos que Apache muestre el contenido de la carpeta. Si quisiéramos que el contenido no apareciese utilizaríamos:

Options -Indexes

Es importante mencionar que con el contenido anterior del fichero .htaccess, el contenido de la carpeta será visible para todos los usuarios, que podrán ver y descargar el contenido de todos los ficheros de la carpeta y subcarpetas que esta contenga.

También es importante que el fichero .htaccess tenga los permisos «644» (-rw-r–r–): el propietario, el usuario administrador tendrá permisos de lectura y escritura, el grupo tendrá permisos de lectura y el resto de los usuarios tendrán permisos de lectura. Para establecer estos permisos ejecutaremos el siguiente comando:

chmod 644 /apache/web/www/publico/.htaccess

Copiaremos o crearemos en esta carpeta los ficheros que queramos que sean públicos en nuestro sitio web para todos los usuarios. En nuestro caso hemos copiado los ficheros aa.zip, aaaf_cf.zip, abd_cf.zip.

Lo que habremos conseguido con esto es que si el usuario introduce en su navegador web la dirección de nuestro sitio web, seguida de «/publico»:

http://www.proyectoa.com/publico

Aparecerá algo así:

Listado de ficheros y carpetas de subcarpeta con .htaccess

Si intentásemos acceder a la carpeta «publico» sin haber puesto el fichero .htaccess correctamente mostrará esta ventana de error:

Error si el fichero .htaccess no está en la carpeta

Con el texto: «Forbidden You don’t have permission to access /publico/ on this server».

Un ejemplo de fichero .htaccess con descripciones

Con el ejemplo anterior sólo mostramos el contenido de una carpeta, ahora vamos a añadir descripciones para cada fichero, para facilitar al usuario la información mostrada. Lo que pretendemos es que en la columna «Description» del ejemplo anterior aparezca una descripción por cada fichero. Para ello volveremos a editar el fichero .htaccess y le añadiremos las siguientes líneas:

Resultado utilizando .htaccess y AddDescription

AddDescription «AjpdSoft Actualización automática 1.0.2.6» «aa.zip»
AddDescription «AjpdSoft Aplicación asociada a fichero» «aaaf_cf.zip»
AddDescription «AjpdSoft Acceso a Oracle y MySQL» «abd_cf.zip»

Donde:

  • AddDescription: parámetro para añadir descripción a los ficheros.
  • «» (primeras comillas): descripción que aparecerá en la columna «Description».
  • «» (segundas comillas): nombre del fichero al que se le asignará la descripción.

El resultado quedará de la siguiente forma, así el usuario sabrá qué contiene cada fichero:

Resultado utilizando .htaccess y AddDescription

Nota: si tuviésemos una subcarpeta dentro de «publico» con ficheros también podríamos utilizar el parámetro «AddDescription» del fichero .htaccess anterior (ubicado en «publico») para añadir la descripción a los ficheros de la subcarpeta.

Carpeta con acceso sólo para usuarios autenticados (usuario y contraseña) con .htaccess

Ahora complicaremos un poco más la configuración de nuestro servidor Apache con .htaccess. Supongamos que queremos que sólo dos usuarios puedan acceder a una determinada carpeta de nuestro servidor. Además, para acceder deberán introducir nombre de usuario y contraseña. Esto es posible gracias al fichero .htaccess y a un segundo fichero donde guardaremos los usuarios y contraseñas.

En primer lugar deberemos crear el fichero que contendrá los usuarios y contraseñas encriptadas. Este ficheros es muy importante que esté situado siempre un nivel inferior a la carpeta raíz de nuestro sitio web. De esta forma conseguiremos que no sea público y accesible desde fuera, impidiendo que algún usuario pudiera abrirlo y obtener los usuarios y las contraseñas. Para evitar esto guardaremos el fichero, en nuestro caso, en:

/apache/web/contra_priv

(una carpeta inferior a la carpeta de nuestra web /apache/web/www)

Para crear este fichero utilizaremos el comando Linux htpasswd, para ello accederemos a /apache/web/contra_priv con

cd /apache/web/contra_priv

Y ejecutaremos el comando:

htpasswd -c fichero_pwd alonso

(donde «alonso» será el nombre del usuario que creará el comando htpasswd y fichero_pwd será el nombre del fichero creado)

Nos pedirá la contraseña para el usuario especificado, que deberemos introducir dos veces.

A continuación os mostramos la ventana de terminal con los comandos a ejecutar para crear el fichero con los usuarios y contraseñas, también el contenido del fichero fichero_pwd creado:

Comandos de la ventana de terminal para crear fichero de contraseñas

Con el texto :

ajpdsoft@xxx:~$ mkdir contra_priv
ajpdsoft@xxx:~$ cd contra_priv
ajpdsoft@xxx:~/contra_priv$ htpasswd -c fichero_pwd alonso
New password:
Re-type new password:
Adding password for user alonso
ajpdsoft@xxx:~/contra_priv$ ls -lah
total 4.0K
drwxr-xr-x 2 ajpdsoft 80 Jun 9 20:22 .
drwxr-x–x 9 ajpdsoft 456 Jun 9 20:20 ..
-rw-r–r– 1 ajpdsoft 21 Jun 9 20:23 fichero_pwd
ajpdsoft@xxx:~/contra_priv$ cat fichero_pwd
alonso:F2qRaD.zm.C/.
ajpdsoft@xxx:~/contra_priv$

Como se puede observar, el comando htpasswd, genera el fichero y encripta las contraseñas.

Una vez creado el fichero de contraseñas crearemos la carpeta que haremos privada. Para ello, como siempre, lo crearemos dentro de la carpeta raíz de nuestro servidor web, en nuestro caso:

cd /apache/web/www

A continuación crearemos el directorio que será privado, con el comando:

mkdir privado

Seguidamente crearemos el fichero .htaccess, con el comando:

vi .htaccess

Con el contenido:

AuthType Basic
AuthName «AjpdSoft – Privado»
AuthUserFile /apache/web/contra_priv/fichero_contrasenas
Require user alonso
IndexOptions +FancyIndexing
IndexOptions -SuppressDescription
IndexOptions -ScanHTMLTitles
IndexOptions +SuppressHTMLPreamble
IndexOptions +SuppressLastModified
Options +Indexes
AddDescription «Datos privados de alonso» «datos.rar»
AddDescription «Código fuente de Control de Campo» «cdc_cf.rar»

Donde:

  • AuthType: indicará el tipo de autenticación.
  • AuthName: nombre sólo a efectos informativos.
  • AuthUserFile: con este parámetro indicaremos la ubicación y nombre del fichero de contraseñas creado anteriormente con htpasswd.
  • Require user nombre_usuario: con este comando indicaremos el nombre del usuario que tendrá acceso a la carpeta privada.

De esta forma, cuando un usuario intente acceder a nuestra carpeta privada:

http://www.proyectoa.com/privado

Nos mostrará una ventana de autenticación, para introducir usuario y contraseña:

Ventana de petición de usuario y contraseña

Si introducimos el usuario y la contraseña correctos nos mostrará el contenido del directorio «privado»:

Contenido indexado de la carpeta privada

En caso de no introducir usuario y contraseña correctos el servidor Apache mostrará una página de error con el texto:

Authorization Required
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn’t understand how to supply the credentials required.
Server at www.proyectoa.com Port 80

Restringir acceso a un determinado fichero con .htaccess

Os explicamos a continuación cómo restringir el acceso a un determinado fichero de una carpeta de nuestro sitio web. Sólo introduciendo usuario y contraseña se podrá descargar el fichero indicado.

Para ello, como siempre, crearemos el fichero .htaccess (o modificaremos el existente) de la carpeta que contenga el fichero a proteger, añadiremos las siguientes líneas:

<Files «/apache/web/www/publico/fichero_protegido.zip»>
Require user alonso
</Files>

Con lo anterior indicaremos a Apache que para acceder al fichero «fichero_protegido.zip» será necesario introducir el usuario «alonso» y su correspondiente contraseña. Los datos del usuario y contraseña, como se ha explicado anteriormente, estarán alojados en el fichero indicado en la directiva AuthUserFile.

Conclusión del uso del fichero .htaccess

Como podemos observar el uso del fichero .htaccess puede ser muy útil para determinadas circunstancias. Con el uso de este fichero evitaremos tener que dar permisos a las carpetas utilizando el propio sistema operativo. De hecho, cuando tenemos nuestra página web alojada en un servidor externo (hosting), lo normal es que no tengamos acceso a modificar los permisos de las carpetas, por ello el uso de este fichero nos puede servir para «simular» estos permisos.

Y, además, como ya hemos dicho en este manual, .htaccess no sólo sirve para indexar determinadas carpetas, también se puede utilizar para otros acciones. Por ejemplo, podemos hacer que cuando un usuario acceda a una URL de nuestro sitio web sea redireccionado a otra, colocando un fichero .htaccess con el siguiente contenido:

Redirect permanent carpeta_actual nueva_URL

Por ejemplo:

Redirect permanent /alonso http://www.proyectoa.com

Con esta directiva colocada en el fichero .htaccess, cuando un usuario acceda a nuestro_dominio/alonso, Apache redireccionará automáticamente a la URL www.proyectoa.com, de forma instantánea y totalmente transparente al usuario.

ANEXO

  • Para que funcione el uso del fichero .htaccess, deberá existir la siguiente línea en el fichero de configuración de Apache httpd.conf : AllowOverride All
  • Otras directivas del fichero .htaccess: por supuesto, existen decenas de directivas para este fichero, aquí sólo hemos definido y utilizado algunas de ellas.
  • Para realizar este artículo hemos usado:
    • Equipo con Linux Ubuntu, como servidor web, con Apache.
    • Equipo con Windows XP, para acceso al servidor web.
    • PuTTY: software gratuito para acceso mediante SSH a Linux.