P2.5 Directiva Directory
La directiva Directory en un archivo de configuración de Apache se utiliza para aplicar configuraciones específicas a un directorio particular en el sistema de archivos del servidor web. Esta directiva permite definir permisos, opciones y otras configuraciones que afectan cómo Apache maneja las solicitudes para ese directorio.
Situación inicial
Supongamos que tenemos un host virtual configurado en Apache que sirve contenido desde el directorio /var/www/sitio1 pero queremos que se sirva el contenido desde el directorio /www/sitio1.
Si creamos el directorio /www/sitio1 y colocamos un archivo index.html en él:
sudo mkdir -p /www/sitio1
sudo nano /www/sitio1/index.html
<VirtualHost *:80>
ServerName sitio1.local
DocumentRoot /www/sitio1
</VirtualHost>
Y luego intentamos acceder a http://sitio1.local, es probable que recibamos un error 403 Forbidden, ya que Apache no tiene permisos para acceder a ese directorio.
Configuración de Directory
Si queremos que Apache sirva contenido desde el directorio /www/sitio1, necesitamos configurar la directiva Directory en el archivo de configuración del host virtual correspondiente.
- Editar el fichero de configuración del host virtual:
sudo nano /etc/apache2/sites-available/sitio1.conf - Agregar la directiva Directory. Dentro del bloque
<VirtualHost>, agrega la siguiente configuración:<Directory /www/sitio1> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> -
Guardar y salir del editor.
-
Reiniciar Apache para aplicar los cambios:
sudo systemctl restart apache2
Verificación
Ahora, si accedemos a http://sitio1.local en nuestro navegador, deberíamos ver el contenido del archivo index.html ubicado en /www/sitio1.
Esto demuestra cómo la directiva Directory puede ser utilizada para configurar permisos y opciones específicas para un directorio en Apache, permitiendo que el servidor web sirva contenido desde ubicaciones personalizadas en el sistema de archivos.
Alias y Directory
Es común utilizar la directiva Alias junto con la directiva Directory para mapear una URL a un directorio fuera de la raíz del documento web y luego configurar los permisos para ese directorio. Por ejemplo, si queremos servir el contenido del directorio /www/recursos a través de la URL http://sitio1.local/recursos, podemos hacer lo siguiente:
Crear el directorio y agregar un archivo:
sudo mkdir -p /www/recursos
sudo nano /www/recursos/index.html
-
Agregar la directiva Alias. En el archivo de configuración del host virtual, dentro del bloque
<VirtualHost>, agrega la siguiente línea:Alias /recursos /www/recursos -
Configurar la directiva Directory. Justo después de la directiva
Alias, agrega la siguiente configuración:<Directory /www/recursos> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> -
Guardar y salir del editor.
-
Reiniciar Apache para aplicar los cambios:
sudo systemctl restart apache2
Verificación
Ahora, si accedemos a http://sitio1.local/recursos en nuestro navegador, deberíamos ver el contenido del directorio /www/recursos.
Esto demuestra cómo las directivas Alias y Directory pueden ser utilizadas en conjunto para servir contenido desde ubicaciones personalizadas en el sistema de archivos, mientras se configuran los permisos adecuados para el acceso a esos directorios.
Directory Options
La directiva Options dentro de una directiva Directory permite configurar varias opciones que afectan cómo Apache maneja las solicitudes para ese directorio. Algunas de las opciones más comunes incluyen:
Indexes: Permite la generación automática de un índice de directorio si no hay un archivoindexpresente.FollowSymLinks: Permite que Apache siga enlaces simbólicos en el sistema de archivosNone: Desactiva todas las opciones.
Indexes
Si no habilitamos la opción Indexes, Apache no generará automáticamente una lista de los archivos y subdirectorios dentro del directorio si no hay un archivo index presente. Por ejemplo:
- 1. Borrar el archivo index.html para probar:
sudo rm /www/sitio1/index.html - Creamos varios archivos en el directorio:
cd /www/sitio1 sudo touch archivo1.txt archivo2.txt archivo3.txt - Configurar la directiva Directory sin Indexes:
<Directory /www/sitio1> Options None AllowOverride None Require all granted </Directory> - Reiniciar Apache para aplicar los cambios:
sudo systemctl restart apache2
Si accedemos a http://sitio1.local sin la opción Indexes, recibiremos un error 403 Forbidden. Sin embargo, si habilitamos la opción Indexes en la directiva Directory, Apache generará automáticamente una lista de los archivos presentes en el directorio.
<Directory /www/sitio1>
Options Indexes
AllowOverride None
Require all granted
</Directory>
http://sitio1.local, veremos una lista de los archivos archivo1.txt, archivo2.txt y archivo3.txt.
Advertencia
Las opciones de Directory se heredan en los subdirectorios, a menos que se sobrescriban explícitamente. Por lo tanto, es importante configurar las opciones adecuadamente para evitar problemas de seguridad o acceso no deseado a los archivos.
FollowSymLinks
La opción FollowSymLinks permite que Apache siga enlaces simbólicos en el sistema de archivos. Si esta opción no está habilitada, Apache no podrá acceder a los archivos a los que apuntan los enlaces simbólicos.
Supongamos que tenemos esta configuracion para sitio1.local:
<Directory /www/sitio1>
Options Indexes
AllowOverride None
Require all granted
</Directory>
-
Crearemos el directorio
/www/sitio1/enlacescon algunos archivos:sudo mkdir -p /www/sitio1/enlaces cd /www/sitio1/enlaces sudo touch archivo_enlace1.txt archivo_enlace2.txt -
Ahora, crearemos un enlace simbólico en
/www/sitio1que apunte al directorioenlaces:sudo ln -s /www/sitio1/enlaces /www/sitio1/directorio -
Si intentamos acceder a
http://sitio1.local/directorio, recibiremos un error 403 Forbidden porque la opciónFollowSymLinksno está habilitada. -
Modificamos la configuración de
Directorypara incluirFollowSymLinks:sudo nano /etc/apache2/sites-available/sitio1.conf5. Guardamos y salimos del editor, luego reiniciamos Apache:<Directory /www/sitio1> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>6. Ahora, al acceder asudo systemctl restart apache2http://sitio1.local/directorio, podremos ver el contenido del directorioenlacesa través del enlace simbólico.
Peligro de seguridad
Advertencia de seguridad
Habilitar la opción FollowSymLinks puede presentar riesgos de seguridad si los enlaces simbólicos apuntan a ubicaciones no deseadas en el sistema de archivos. Asegúrate de que los enlaces simbólicos solo apunten a directorios y archivos que deseas que sean accesibles a través del servidor web.
Por ejemplo:
- Si hacemos un enlace simbólico que apunta a un directorio sensible, como
/etc:sudo ln -s /etc /www/sitio1/sistema - Y luego accedemos a
http://sitio1.local/sistema, podríamos potencialmente exponer archivos sensibles del sistema, lo cual es un riesgo de seguridad significativo.
Aunque la carpeta /etc no esté accesible directamente por alguna configuración Directory, el simple hecho de tener enlaces simbólicos mal configurados puede llevar a vulnerabilidades.
Multiviews
La opción Multiviews permite a Apache seleccionar automáticamente el mejor archivo para servir en función de las preferencias del cliente (como el idioma o el tipo de contenido). Por ejemplo, si tienes varios archivos con el mismo nombre pero diferentes extensiones (como index.html, index.fr.html, index.es.html), Apache puede elegir el archivo más adecuado según las preferencias del navegador del cliente.
Para habilitar Multiviews, simplemente agrega la opción a la directiva Directory:
- Edita el archivo de configuración del host virtual:
sudo nano /etc/apache2/sites-available/sitio1.conf - Agrega la opción
Multiviews:<Directory /www/sitio1> Options Indexes FollowSymLinks Multiviews AllowOverride None Require all granted </Directory> - Guarda y sal del editor, luego reinicia Apache:
sudo systemctl restart apache2 - Crea varios archivos en el directorio
/www/sitio1:cd /www/sitio1 sudo nano index.html sudo nano index.en.html sudo nano index.es.html - Modifica el idioma preferido en tu navegador y accede a
http://sitio1.local. Apache seleccionará automáticamente el archivo más adecuado según las preferencias del navegador.