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.
Módulos relacionados mod_env mod_rewrite mod_setenvif mod_unique_id |
Directivas relacionadas BrowserMatch BrowserMatchNoCase PassEnv RewriteRule SetEnv SetEnvIf SetEnvIfNoCase UnsetEnv |
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
.
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.
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.
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.
suexec.c
.
Módulos Relacionados mod_access mod_cgi mod_include mod_log_config mod_rewrite |
Directivas Relacionadas Allow CustomLog Deny LogFormat RewriteCond RewriteRule |
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.
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.
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).
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.
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.
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.
Esto fuerza que el requerimiento sea tratado como HTTP/1.0 incluso si este estuviera en un dialecto posterior.
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.
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.
Deshabilita KeepAlive cuando esta establecida.
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
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
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.".