Variables de entorno en Apache

Muchos sistemas operativos proveen una facilidad para almacenamiento y transmición de información llamada variables de entorno. Apache usa variables de entorno de diferentes maneras para controlar operaciones y comunicarse con otros programas como programas CGI. Este documento explica algunas de las maneras de usar variables de entorno en Apache.


Estableciendo Variables de Entorno

Módulos relacionados

mod_env
mod_rewrite
mod_setenvif
mod_unique_id
Directivas relacionadas

BrowserMatch
BrowserMatchNoCase
PassEnv
RewriteRule
SetEnv
SetEnvIf
SetEnvIfNoCase
UnsetEnv

Manipulación Básica del Entorno

La forma más sencilla de establecer una variable en Apache es usando la directiva incondicional SetEnv. Las variables también pueden ser pasadas al entorno del shell, el cual fué arrancado por el servidor, usando la directiva PassEnv.

Por-Requerimiento Condicional

Para una flexibilidad adicional, las directivas provistas por mod_setenvif permiten establecer variables de entorno Por-Requerimiento condicionales sobre todas las características del requerimiento en particular. Por ejemplo, una variable puede ser establecida únicamente cuando un Navegador específico (User-Agent) es quien realiza el requerimiento, o únicamente cuando un encabezado Referer [sic] es encontrado.Incluso más flexibilidad está disponible a través de la directiva RewriteRule de mod_rewrite la cual usa la opción [E=...] para establecer variables de entorno.

Identificadores únicos

Finalmente, mod_unique_id establece la variable de entorno UNIQUE_ID para cada requerimiento a un valor el cual se garantiza que será único a través de "todos" los requerimientos bajo condiciones muy específicas.

Variables CGI estándar

En suma a todas las variables de entorno establecidas dentro de la configuración de Apache y pasadas al entorno del shell, los programas CGI y las páginas SSI son provistas con un conjunto de variables de entorno conteniendo meta-información acerca del requerimiento tal como es requerido por la especificación CGI.

Algunas advertencias


Usando Variables de Entorno

Módulos Relacionados

mod_access
mod_cgi
mod_include
mod_log_config
mod_rewrite
Directivas Relacionadas

Allow
CustomLog
Deny
LogFormat
RewriteCond
RewriteRule

Programas CGI

Uno de los principales usos de variables de entorno es para comunicar información a los programas CGI. Como se discutió anteriormente, el entorno pasado a los programas CGI incluye meta-información estándar acerca del requerimiento en adición a las variables establecidas dentro de la configuración de Apache. Para más detalles, vea el tutorial de CGI.

Páginas SSI

Los documentos analizados sintácticamente por el servidor (SSI) y procesados por el manipulador server-parsed del módulo mod_include, pueden imprimir variables de entorno usando el elemento echo, y pueden usar variables de entorno en elementos de control de flujo para hacer partes de una página condicional de acuerdo a las características de un requerimiento. Apache también provee a las páginas SSI con las variables estándar para CGI como fuera mencionado anteriormente. Para más detalles, ver el tutorial de SSI.

Control de acceso

El acceso al servidor puede ser controlado basado en el valor de variables de entorno usando las directivas allow from env= y deny from env=. En combinación con SetEnvIf, esto le permite un flexible control de acceso al servidor based en las características del cliente. Por ejemplo, puede usar estas directivas para denegar el acceso a un navegador en particular. (User-Agent).

Registro (logging) Conditional

Las variables de entorno pueden ser registradas en los archivos de registro de acceso usando la opción %e de LogFormat. En suma, la decisión de cuando o no registrar requerimientos puede estar basada en el estado de las variables de entorno usando la forma condicional de la directiva CustomLog. En combinación con SetEnvIf esto permite un control flexible de cuales requerimientos deben ser registrados. Por ejemplo, puede elegir no registrar requerimientos para nombres de archivos terminando en gif, o puede elegir registrar unicamente aquellos requermientos viniendo desde fuera de su subred.

Reescribiendo URLs

Usando %{ENV:...} de TestString en la RewriteCond le permite a mod_rewrite tomar decisiones basado en las variables de entorno. Note que las variables accesibles en mod_rewrite sin el prefijo ENV: no son actualmente variables de entorno. En cambio, son variables especiales para mod_rewrite lasm cuales no pueden ser accedidas desde otros módulos.


Variables de Entorno de Propósito Especial

Problemas de interoperabilidad han causado la introducción de mecanismos para modificar la forma en que Apache se comporta cuando se comunica con algunos clientes en particular. Para hacer estos mecanismos tan flexibles como sea posible, estos son invocados definiendo variables de entorno, por ejemplo, BrowserMatch, SetEnv y PassEnv tambíen puede ser usado.

downgrade-1.0

Esto fuerza que el requerimiento sea tratado como HTTP/1.0 incluso si este estuviera en un dialecto posterior.

force-no-vary

Causa que cualquier campo Vary sea removido del encabezado de respuesta antes que sea enviado al cliente. Algunos clientes no interpretan correctamente este campo (ver problemas conocidos de clientes); estableciendo esta variable puede trabajar en la solución del problema. Establecer esta variable también implica force-response-1.0.

force-response-1.0

Fuerza una respuesta HTTP/1.0 cuando esta establecida. Fué implementada originalmente como el resultado de un problema con los proxies de AOL. Algunos clientes podrían no interpretar correctamente una respuesta HTTP/1.1, y esto puede ser usado para interoperar con este problema.

nokeepalive

Deshabilita KeepAlive cuando esta establecida.


Ejemplos

Cambiando el comportamiento del protocolo con clientes que actúan mal

Recomendamos que las siguiente líneas sean incluídas en httpd.conf para tratar con los problemas conodidos de los clientes.

#
# Las siguientes directivas modifican el comportamiento normal de las respuestas HTTP
# La primera directiva deshabilita keepalive para Netscape 2.x y navegadores que 
# engañan. Hay problemas conocidos con esas implementaciones. 
# La segunda directiva es para Microsoft Internet Explorer 4.0b2
# el cual tiene una implementación rota de HTTP/1.1 y no soporta en forma apropiada
# keepalive cuando es usado en respuestas 301 o 302 (redirect).
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#
# La siguiente directiva deshabilita respuestas HTTP/1.1 a los browsers que
# violan la especificación HTTP/1.0 por no ser capaces de entender una 
# respuesta 1.1 básica.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

No registrar requerimientos para imágenes en los archivos log

Este ejemplo muestra como mantener los requerimientos para acceder a imágenes fuera de los archivos de registro. Puede ser facilmente modificado para prevenir el registro de directorios particulares, o prevenir el registro de requerimientos viniendo de ciertos hosts.

    SetEnvIf Request_URI \.gif image-request
    SetEnvIf Request_URI \.jpg image-request
    SetEnvIf Request_URI \.png image-request
    CustomLog logs/access_log env=!image-request

Previniendo "Robo de Imágenes"

Este ejemplo muestra como evitar que gente que no es de su servidor use imágenes de su servidor dentro de sus páginas. Esta configuración no es recomendada, pero puede servir en circunstancias liitadas. Asumimos que el directorio de imágenes se llama /web/images.

    SetEnvIf Referer "^http://www.ejemplo.com/" local_referal
    # Permite navegadores que no envían el encabezado Referer
    SetEnvIf Referer "^$" local_referal
    <Directory /web/images>
       Order Deny,Allow
       Deny from all
       Allow from env=local_referal
    </Directory>

Nota: ortografía de 'referer' y 'referal' es intencional.

Para más información acerca de esta técnica, vea el turorial de ApacheToday "Previniendo que su imágenes adornen otros sitios.".