Ya hemos hablado de los contextos en los cuales podemos encontrar directivas y de algunas directivas, y
hemos tratado superficialmente las secciones que hay asociadas a cada contexto. Ahora es el momento de
ahondar en las secciones más importantes.
Algunas de estas secciones ya las hemos tratado superficialmente, como la sección Directory, que permite
aplicar un conjunto de directivas de forma específica a un directorio y sus subdirectorios de nuestro
servidor. O la sección Files que permite aplicar un conjunto de directivas de forma específica a un
conjunto de archivos.
Es importante saber que la directiva Directory, y otras directivas, pueden contener caracteres comodín y
expresiones regulares. Las expresiones regulares son expresiones que permiten expresar un patrón de
búsqueda, si el directorio al que se está accediendo tras la petición web encaja con el patrón de búsqueda
entonces se aplicarán las restricciones. Veamos un ejemplo:
<Directory /var/www/html/te*/>
Options +Indexes
AllowOverride AuthConfig
</Directory>
El carácter comodín en el ejemplo anterior es el asterísco (*) el cual significa literalmente "una
secuencia de cero o más símbolos alfanuméricos". En dicho ejemplo, la sección Directory anterior se
aplicaría a un directorio como /var/www/html/test, y a otros tales como /var/www/html/te o
/var/www/html/tesoro
, pero no al directorio /var/www/html/mitest. Otro carácter comodín es el
interrogante (?), que significaría por un único símbolo alfanumérico.
En el ejemplo anterior se han aplicado además dos directivas bastante comunes a la sección Directory: la
directiva Options que se puede aplicar en varias secciones y que permite habilitar o deshabilitar
características concretas para una sección; y la directiva AllowOverride, que solo se puede usar dentro de
un Directory, y que permite indicar si se pueden sobrescribir algunas directivas a través de archivos
.htaccess.
Vamos a detenernos un momento a analizar ese ejemplo de uso de la directiva Options. Al
escribir Options +Indexes estamos diciendo a Apache que, si en la URL no se especifica el recurso a servir (por
ejemplo, se pone http://localhost/test/ en vez de http://localhost/test/imagen1.jpg), y en dicha
carpeta no encuentra un archivo DirectoryIndex (index.html
por ejemplo), se generará un
listado del contenido de la carpeta similar al siguiente:
Si por el contrario, la directiva fuera Options -Indexes el resultado sería el contrario,
deshabilitaríamos esa característica y obtendríamos el siguiente resultado:
Existen varias características asociadas a la directiva Options y lo mejor es consultar la documentación
para conocerlas, dado que aquí es imposible tratarlas todas. La otra directiva indicada antes,
AllowOverride permite escribir directivas en archivos .htaccess. Los archivos .htaccess son archivos que
se colocan directamente el directorio en el que queremos aplicar dichas directivas, por ejemplo, si
queremos aplicar directivas específicas al directorio /home/www/html/tesoro/privado, podríamos hacer lo
siguiente:
- En un archivo de configuración principal (/etc/apache2/apache2.conf por ejemplo), pondríamos
AllowOverride dentro de una sección Directory. Recuerda que la sección Directory aplica las directivas
al directorio indicado y a los subdirectorios que haya dentro, por lo que el ejemplo anterior:
<Directory /home/www/html/te*>; nos serviría.
- Crearíamos el archivo .htaccess en el directorio en cuestión (/home/www/html/tesoro/privado en este
caso), y dentro escribiríamos las directivas a aplicar, por ejemplo:
#Archivo .htaccess en /home/www/html/tesoro/privado
Require all denied
Con el ejemplo anterior estaríamos limitando el acceso a la carpeta /home/www/html/tesoro/privado. La
ventaja de los archivos .htaccess, es que podemos escribir directivas en ellos y no es necesario reiniciar
Apache para que las directivas se apliquen. El inconveniente es que en dichos archivos solo se pueden usar
aquellas directivas aplicables en el contexto .htaccess.
El conjunto de directivas que podemos poner en un archivo .htaccess va limitado por la directiva
AllowOverride. Veamos diferentes ejemplos:
- AllowOverride All: Todas las directivas aplicables dentro del contexto .htaccess.
- AllowOverride AuthConfig: Solo directivas de tipo autenticación y control de acceso, como AuthUserFile
o
Require
.
- AllowOverride AuthConfig Indexes: Se pueden usar directivas de tipo de autenticación y relativas a la
indexación de documentos (por ejemplo, para cambiar el DocumentIndex de una carpeta concreta).
El conjunto de variantes completo de AllowOverride es mejor que lo consultes en la documentación.
Otra sección de relevancia es la sección Location que permite aplicar directivas en función de la
URL de la petición. Imagina que en un
servidor web que tienes configurado estás sirviendo contenido a través de la URL http://www.midominio.local/contenido (es decir,
un navegador puede acceder al contenido de tu web a través de esa URL anterior), pero quieres limitar el acceso
cuando la URL sea
http://www.midominio.local/contenido/protegido. En ese caso podrías poner directivas que se aplicaran solo
cuando una URL tenga una forma específica:
<Location "/*/protegido">
Require all denied
</Location>
En este caso, cuando el recurso solicitado en la petición HTTP siga el patrón anterior (recuerda que * es un carácter comodín), se denegará el
acceso. Aunque la sección Location tiene muchas ventajas (por ejemplo, se aplica aunque se cambie el
DocumentRoot) normalmente se prefiere el uso de la directiva Directory.
Paralelamente a las secciones Directory y Location
existen las secciones DirectoryMatch y
LocationMatch
, que permiten poner una expresión regular en vez de un directorio o un camino
al recurso, y que son mucho más flexibles que los caracteres comodín.
Es normal encontrar las secciones Directory y Location
(y sus compañeros que usan
expresiones regulares), dentro de la configuración global, pero también es muy normal encontrarlas dentro
lo que llamamos un VirtualHost o host
virtual.
Apache permiten servir diferente contenido en función del nombre de dominio, del puerto, o simplemente de
la dirección IP. Por ejemplo, un mismo servidor web
puede servir contenido diferente para http://localhost/miweb, para http://www.midominio.local/miweb, y
para otros casos que se nos ocurra configurar; y esto se logra gracias a los VirtualHost.
Cuando las secciones Directory y Location
se configuran dentro de un host virtual, solo se
aplican en el contexto de ese host virtual, y no a nivel global. Por ejemplo:
<VirtualHost *:80>
ServerName www.midominio.local
ServerAdmin webmaster@midominio.local
DocumentRoot /var/www/midominiolocal
<strong><Directory /var/www/<code>midominiolocal/protegido>
Require all denied
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
En este VirtualHost se especifica el contenido a servir cuando se accede al servidor web Apache
solicitando el dominio www.midominio.local. En el ejemplo anterior la directiva Directory solo se aplica
en el contexto del VirtualHost. Los hosts virtuales se ven con mayor detalle un poco más adelante.
Dominios independientes que se pueden alojar en un mismo servidor web.