Estructura de configuración de Apache

Actualizado el 31 de agosto, 2016. Por BlueHosting.

Nuestras guías básicas de instalación de Apache y de la Infraestructura LAMP sugieren una configuración muy simple del servidor web Apache, con base en configuraciones <VirtualHost>. Esta configuración es útil para algunos sitios web de un servidor único, pero este enfoque no provee un control granular sobre el comportamiento de los recursos en los sitios.
El bloque <VirtualHost> proporciona a los administradores la capacidad de modificar el comportamiento del servidor web por cada dominio o por cada host; cualquier opción especificada en el bloque <VirtualHost> aplica a todo el dominio. Sin embargo, no dan la capacidad de especificar opciones por directorio. Afortunadamente, Apache ofrece posibilidades adicionales para configuraciones específicas. Esta guía incluye varias maneras de configurar el comportamiento de su servidor web en un nivel muy específico: por directorio e incluso por archivo.

Directorio y opciones

El bloque <Directory> se refiere al directorio en el sistema de archivos y especifica cómo se comportará Apache con respecto a ese directorio. Este bloque se coloca entre corchetes angulares y comienza con la palabra "Directory" seguido por una ruta al directorio en el sistema de archivos. El cierre del bloque se indica con la etiqueta de cierre </Directory> Las opciones establecidas en un bloque de directorio aplican al directorio y sus subdirectorios. A continuación un ejemplo de un bloque directory:

Extracto de archivo: Entrada de host virtual en un archivo de configuración Apache

<Directory /srv/www/example.com/public_html/images>
    Order Allow,Deny
    Allow from all
    Deny 55.1
</Directory>

Datos adicionales sobre el bloque <Directory>:

  • Los bloques de directorio no pueden ser anidados entre sí.
  • Los bloques de directorio sí pueden ser anidados dentro de los bloques <VirtualHost>.
  • La ruta contenida en un bloque <Directory> puede contener un carácter comodín. El asterisco (*) hará coincidencia con cualquier serie de caracteres mientras que el signo de interrogación (?) hará coincidencia contra cualquier carácter simple. Esto puede resultar útil si necesita tener control de una opción para el DocumentRoot de todos los hosts virtuales. Por ejemplo: podría comenzar un bloque <Directory> con la siguiente línea:
    <Directory /srv/www/*/public_html>
    

Opciones de archivo

Si necesita mayor control sobre archivos específicos dentro de un directorio de su servidor, puede utilizar la directiva <Files>. Esta controla el comportamiento del servidor web con respecto a un archivo único. Las directivas <Files> aplicarán a cualquier archivo con un nombre específico. Por ejemplo, la siguiente directiva de ejemplo hará coincidirá con cualquier archivo llamado lista.htm en su sistema de archivos o filesystem:

Extracto del archivo: Directiva de archivos en un archivo de configuración Apache

<Files lista.htm>
     Order Allow,Deny
     Deny from all
</Files>

Dependiendo de dónde ubique la directiva, tendrá una acción específica:

  • Si la directiva está dispuesta en un bloque <VirtualHost>, esta aplicará a todos los archivos llamados lista.htm en el DocumentRoot o en los directorios ubicados dentro del DocumentRoot de ese Host.
  • Si la directiva <Files> está colocada dentro de un bloque <Directory>, las opciones especificadas aplicarán a todos los archivos con el nombre lista.htm dentro del directorio especificado, o los subdirectorios de este último.

Opciones de ubicación

Mientras que los bloques <Files> y <Directory> controlan el comportamiento de Apache con respecto a las ubicaciones en el sistema de archivos, la directiva <Location> controla el comportamiento de Apache según una ruta particular solicitada por el cliente. Si un usuario hace una solicitud a http://www.ejemplo.com/webmail/inbox/, el servidor web buscaría en el directorio webmail/inbox/ bajo el DocumentRoot como /srv/www/ejemplo.com/public_html/webmail/inbox/. Un uso común de esta función podría ser permitir que un script maneja las solicitudes hechas en una ruta dada. Por ejemplo, el siguiente bloque dirige todas las solicitudes de una ruta específica al script mod_python:

Extracto del archivo: Directiva de ubicación en un archivo de configuración Apache

<Location /webmail/inbox>
    SetHandler python-program
    PythonHandler modpython
    PythonPath "['/srv/www/ejemplo.com/application/inbox'] + sys.path"
</Location>

Note que las opciones especificadas en las directivas <Location> son procesadas después de las opciones especificadas en los bloques <Directory> y pueden sobrescribir cualquier opción establecida en estos bloques, haciéndola nula.

Opciones de htaccess

Además de los métodos de configuración discutidos arriba, las configuraciones predeterminadas de Apache leerán las opciones de configuración para un directorio en un archivo ubicado en ese directorio. El nombre típico de este archivo es .htaccess. Busque las siguientes opciones de configuración en su httpd.conf y sus archivos asociados:

Extracto del archivo: /etc/httpd/httpd.conf o /etc/apache2/apache2.conf

AccessFileName .htaccess

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

La primera línea le dice a Apache que busque opciones de configuración en los archivos .htaccess en directorios de acceso público. La segunda directiva <Files ~ "^\.ht"> le dice a Apache que niegue todas las solicitudes de servir a cualquier archivo que comience con los caracteres .ht. Esto previene que los visitantes de su sitio obtengan acceso a las opciones de configuración.

Puede cambiar el AccessFileName y especificar otro nombre de archivo donde Apache puede buscar las opciones de configuración. Si usted cambia esta opción, asegúrese de actualizar la directiva <Files> para prevenir acceso público no intencional. No se recomienda este acceso por razones de seguridad obvias.

Cualquier opción que pueda ser especificada en el bloque <Directory> puede ser también determinada en un archivo .htaccess. Los archivos .htaccess son particularmente útiles en casos en los cuales el operador de un sitio web es un usuario que tiene acceso a la edición de archivos en el directorio público del sitio web, pero no tiene acceso a los archivos de configuración de Apache.

Los archivos .htaccess son procesados para cada solicitud y aplican a todas las solicitudes de archivos hechas en el directorio actual. Las directivas también aplican en todos los directorios debajo del directorio actual, con referencia a la jerarquía del sistema de archivos.

A pesar del poder y flexibilidad provistos por los archivos .htaccess, hay varias desventajas de usar este tipo de archivo:

  • Si los archivos .htaccess están activos, Apache debe verificar y procesar las directivas en el archivo .htaccess en cada solicitud. Adicionalmente, Apache debe comprobar si hay archivos .htaccess en directorios por encima del directorio actual en el sistema de archivos. Esto puede causar una pequeña degradación del desempeño si otros archivos de acceso están habilitados, y aplica incluso si no son utilizados.
  • Las opciones establecidas en los archivos .htaccess pueden anular las opciones establecidas en los bloques <Directory>, lo que puede causar confusión y comportamientos no deseados. Cualquier opción establecida en el archivo .htaccess puede ser determinada en un bloque <Directory>.
  • Permitir que usuarios sin los privilegios necesarios modifiquen las configuraciones del servidor web representa un riesgo de seguridad potencial, sin embargo las opciones AllowOverride pueden mitigar este riesgo considerablemente.

Si desea deshabilitar los archivos .htaccess para un directorio o un árbol de directorios, especifique la siguiente opción en el bloque de directorio:

Extracto del archivo: Bloque de apache

AllowOverride None

Tenga en cuenta que puede especificar la opción AllowOverride All para un directorio que caiga dentro de otro directorio donde la sobrescritura ha sido deshabilitada.

Expresiones regulares y directivas "Match"

Además de las directivas básicas especificadas anteriormente, Apache también permite a los administradores del servidor cierta flexibilidad adicional con relación a cómo los directorios, archivos y ubicaciones son especificados. Estos bloques "Match" y bloques de directivas de expresiones regulares definidas permiten que los administradores definan un conjunto de opciones de configuración para una clase de directorios, archivos y ubicaciones. Aquí un ejemplo:

Extracto del archivo: Bloque DirectoryMatch en un archivo de configuración de Apache

<DirectoryMatch "^.+/imagenes">
    Order Allow,Deny
    Allow from all
    Deny 55.1
</DirectoryMatch>

Este bloque especifica un número de opciones para cualquier directorio que coincida (o haga match) con la expresión regular ^.+/imagenes. En otras palabras, cualquier ruta que comience con un número de caracteres y termine en /imagenes coincidirá con estas opciones, incluyendo las siguientes rutas: /srv/www/ejemplo.com/public_html/imagenes/, /srv/www/ejemplo.com/public_html/objects/imagenes y /home/username/public/www/imagenes.

Apache también permite una sintaxis alternativa para los bloques de directivas con expresiones regulares definidas. Agregar una virgulilla (~) entre el término Directory y la ruta especificada causa que la ruta especificada sea leída como si fuera una expresión regular. Las expresiones regulares son una sintaxis estándar para la coincidencia de patrones, y Apache soporta variantes de expresiones regulares estándar y también del lenguaje Perl.

Aunque se prefiere utilizar DirectoryMatch, el siguiente bloque es equivalente al anterior en todos los aspectos:

Extracto del archivo: Bloque Directory con expresión regular en un archivo de configuración de Apache

<Directory ~ "^.+/imagenes">
    Order Allow,Deny
    Allow from all
    Deny 55.1
</Directory>

Apache provee una funcionalidad similar para usar expresiones regulares para coincidencias con una clase de ubicaciones o archivos en un conjunto de directivas de configuración. Como resultado, las siguientes opciones especifican configuraciones válidas:

Extracto del archivo: Directivas <File> y <Location> con uso de coincidencias o Match

<Files ~ "^\..+">
    Order allow,deny
    Deny from all
</Files>

<FilesMatch "^\..+">
    Order allow,deny
    Deny from all
</FilesMatch>

<Location ~ "inbox$">
    Order Deny,Allow
    Deny from all
    Allow 192.168
</Location>

<LocationMatch "inbox$">
    Order Deny,Allow
    Deny from all
    Allow 192.168
</LocationMatch>

Note que las directivas <Files> y <FilesMatch> son equivalentes, así como también <Location> y <LocationMatch>.

Orden de prioridad

Con tantas posibilidades de ubicaciones para las opciones de configuración, es posible que especifique una opción en un archivo o bloque y que esta sea anulada por otra opción más adelante. Uno de los retos principales de usar el servidor HTTP Apache es determinar cómo todas las opciones de configuración ubicadas de manera dispar pueden combinarse para producir los comportamientos deseados en su servidor web.

La siguiente lista proporciona una guía de la prioridad que utiliza Apache para fusionar las opciones de configuración. Las opciones posteriores pueden anular las opciones especificadas con anterioridad.

  • Los bloques <Directory> se leen primero.
  • Los archivos .htaccess se leen al mismo tiempo que los bloques <Directory>, pero pueden sobrescribir o anular las opciones especificadas en los bloques <Directory> si esto es permitido a través de la opción AllowOverride.
  • Los bloques <DirectoryMatch> y <Directory ~> se leen después.
  • A continuación se leen las directivas <Files> y <FilesMatch>, una vez que el comportamiento de los directorios es determinado.
  • Finalmente, se leen las directivas <Location> y <LocationMatch>.

En general, las opciones de <Directory> son interpretadas en orden desde la más corta hasta la más larga. En otras palabras, el conjunto de opciones para /srv/www/ejemplo.com/public_html/objects serán procesadas antes que el conjunto de opciones para /srv/www/ejemplo.com/public_html/objects/imagenes sin importar el orden en el que aparezcan en el archivo de configuración. Todas las otras directivas son procesadas en el orden en el que aparecen dentro del archivo de configuración.

Adicionalmente, note que las directivas Include son procesadas de forma lineal. Así, las opciones especificadas en un archivo incluido en la línea 20 de httpd.conf pueden ser anuladas por una opción especificada en la línea 30 de este último, o en otro archivo que esté incluido en este punto.

Recursos adicionales

Para complementar la información aquí presentada puede consultar los siguientes recursos. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...