Versión 2.0 del Servidor HTTP Apache
Variables de entorno de Apache
El servidor HTTP Apache HTTP ofrece un mecanismo para almacenar información en variables especiales que se llaman variables de entorno. Esta información puede ser usada para controlar diversas operaciones como por ejemplo, almacenar datos en ficheros de registro (log files) o controlar el acceso al servidor. Las variables de entorno se usan también como un mecanismo de comunicación con programas externos como por ejemplo, scripts CGI. Este documento explica las diferentes maneras de usar y manipular esas variables.
Aunque estas variables se llaman variables de entorno, no son iguales que las variables de entorno que controla el sistema operativo de la máquina en que se está ejecutando Apache. Las variables de entorno de Apache se almacenan y manipulan la en estructura interna de Apache. Solamente se convierten en auténticas variables de entorno del sistema operativo cuando se pasan a scripts CGI o a scripts Server Side Include. Si quiere manipular el entorno del sistema operativo sobre el que Apache se está ejecutando, debe usar los mecanismos estándar de manipulación que tenga su sistema operativo.
Especificación de variables de entorno
Módulos Relacionados | Directivas Relacionadas |
---|---|
Manipulación básica del entorno
El modo más básico de especificar el valor de una
variable de entorno en Apache es usando la directiva
incondicional SetEnv
. Las variables pueden
también pasarse desde el shell en el que se inicio Apache
usando la directiva PassEnv
.
Especificación condicional por petición
Si necesita más flexibilidad, las directivas incluidas
con mod_setenvif permiten especificar valores para las
variables de entorno de manera condicional en función de
las caracteristicas particulares de la petición que se
esté procesando. Por ejemplo, se puede especificar un
valor para una variable solamente cuando la petición se
haga con un navegador específico, o solamente cuando la
petición contenga una determinada información en su
cabecera. Si necesita aún más flexibilidad, puede
conseguirla con la directiva RewriteRule
del módulo
mod_rewrite que tiene la opción [E=...]
para
especificar valores en las variables de entorno.
Identificadores únicos
Finalmente, mod_unique_id determina el valor de la variable
de entorno UNIQUE_ID
para cada
petición. Este valor está garantizado que sea
único entre todas las peticiones bajo condiciones muy
específicas.
Variables CGI estándar
Además de todas las variables de entorno especificadas en la configuración de Apache y las que se pasan desde el shell, los scripts CGI y las páginas SSI tienen un conjunto de variables de entorno que contienen meta-información sobre la petición tal y como establece la especificación CGI.
Algunas limitaciones
- No es posible reeemplazar los valores o cambiar las variables estándar CGI usando las directivas de manipulación del entorno.
- Cuando se usa
suexec
para lanzar scripts CGI, el entorno se limpia y se queda reducido a un conjunto de variables seguras antes de que se lancen los scripts. La lista de variables seguras se define en el momento de compilar ensuexec.c
. - Por razones de portabilidad, los nombres de las variables de entorno solo pueden contener letras, números y guiones bajos. Además, el primer caracter no puede ser un número. Los caracteres que no cumplan con esta restricción, se reemplazan automáticamente por un guión bajo cuando se pasan a scripts CGI y a páginas SSI.
Cómo usar las variables de entorno
Módulos Relacionados | Directivas Relacionadas |
---|---|
Scripts CGI
Uno de los principales usos de las variables de entorno es pasar información a scripts CGI. Tal y como se explicaba más arriba, el entorno que se pasa a los scripts CGI incluye meta-información estándar acerca de la petición además de cualquier variable especificada en la configuración de Apache. Para obtener más información sobre este tema consulte el tutorial sobre CGIs.
Páginas SSI
Los documentos procesados por el servidor con el filtro
INCLUDES
perteneciente a mod_include pueden
imprimir las variables de entorno usando el elemento
echo
, y pueden usar las variables de entorno en
elementos de control de flujo para dividir en partes una
página condicional según las características de
la petición. Apache también sirve páginas SSI
con las variables CGI estándar tal y como se explica
más arriba en este documento. Para obetener más
información, consulte el tutorial sobre SSI.
Control de acceso
El acceso al servidor puede ser controlado en función
del valor de las variables de entorno usando las directivas
allow from env=
y deny from env=
. En
combinación con la directiva SetEnvIf
, se puede tener un
control más flexible del acceso al servidor en
función de las características del cliente. Por
ejemplo, puede usar estas directivas para denegar el acceso si
el cliente usa un determinado navegador.
Registro condicional
Los valores de las variables de entorno pueden registrarse
en el log de acceso usando la directiva LogFormat
con la
opción %e
. Además, la decisión
sobre qué peticiones se registran puede ser tomada en
función del valor de las variables de entorno usando la
forma condicional de la directiva CustomLog
. En
combinación con SetEnvIf
, esto permite controlar de forma
flexible de qué peticiones se guarda registro. Por
ejemplo, puede elegir no registrar las peticiones que se hagan
a ficheros cuyo nombre termine en gif
, o puede
elegir registrar únicamente las peticiones que provengan
de clientes que estén fuera de su propia red.
Cabeceras de respuesta condicionales
La directiva Header
puede utilizar la
presencia o ausencia de una variable de entorno para
determinar si una determinada cabecera HTTP se incluye en la
respuesta al cliente. Esto permite, por ejemplo, que una
determinada cabecera de respuesta sea enviada únicamente
si también estaba presente en la petición del
cliente.
Activación de filtros externos
External filters configured by mod_ext_filter
using the ExtFilterDefine
directive can
by activated conditional on an environment variable using the
disableenv=
and enableenv=
options.
Reescritura de URLs
La expresion %{ENV:...}
de TestString
en una directiva RewriteCond
permite que el
motor de reescritura de mod_rewrite pueda tomar decisiones en
función del valor de variables de entorno. Tenga en
cuenta que las variables accesibles en mod_rewrite sin el
prefijo ENV:
no son realmente variables de
entorno. En realidad, son variables especiales de mod_rewrite
que no pueden ser accedidas desde otros módulos.
Variables de entorno con funciones especiales
Los problemas de interoperatividad han conducido a la
introducción de mecanismos para modificar el
comportamiento de Apache cuando se comunica con determinados
clientes. Para hacer que esos mecanismos sean tan flexibles
como sea posible, se invocan definiendo variables de entorno,
normalmente con la directiva BrowserMatch
, aunque
también se puede usar por ejemplo con las directivas
SetEnv
y PassEnv
.
downgrade-1.0
Fuerza que la petición sea tratada como una petición HTTP/1.0 incluso si viene en una especificación posterior.
force-no-vary
Hace que cualquier campo Vary
se elimine de la
cabecera de la respuesta antes de ser enviada al
cliente. Algunos clientes no interpretan este campo
correctamente (consulte la sección sobre problemas conocidos con
clientes); usar esta variable puede evitar esos
problemas. Usar esta variable implica también el uso de
force-response-1.0.
force-response-1.0
Fuerza que la respuesta a una petición HTTP/1.0 se haga también según la especificación HTTP/1.0. Esto se implementó originalmente como resultado de un problema con los proxies de AOL. Algunos clientes HTTP/1.0 no se comportan correctamente cuando se les envía una respuesta HTTP/1.1, y este mecanismo hace que se pueda interactuar con ellos.
gzip-only-text/html
Cuando tiene valor "1", esta variable desactiva el filtro
de salida DEFLATE de mod_deflate
para
contenidos de tipo diferentes de text/html
.
no-gzip
Cuando se especifica, se desactiva el filtro
DEFLATE
de mod_deflate
.
nokeepalive
Desactiva KeepAlive
.
prefer-language
Influye en el comportamiento de
mod_negotiation
. Si contiene una etiqueta de
idioma (del tipo en
, ja
o
x-klingon
), mod_negotiation
intenta que se use ese mismo idioma en la respuesta. Si no
está disponible ese idioma, se aplica el proceso de negociación
normal.
redirect-carefully
Fuerza que el servidor sea especialmente cuidadoso al enviar una redirección al cliente. Se usa normalmente cuando un cliente tiene un problema conocido tratando las redirecciones. Fue implementado originalmente por el problema que presentaba el software de WebFolders de Microsoft, que tenía problemas interpretando redirecciones originadas cuando se accedía a recursos servidos usando DAV.
suppress-error-charset
Disponible en las versiones de Apache 2.0.40 y posteriores
Cuando Apache efectúa una redirección en respuesta a la petición de un cliente, la respuesta incluye algún texto para que se muestre en caso de que el cliente no pueda seguir (o no siga) automáticamente la redirección. Apache normalmente etiqueta este texto siguiendo la codificación ISO-8859-1.
Sin embargo, si la redirección es a una página que usa una codificación diferente, algunas versiones de navegadores que no funcionan correctamente intentarán usar la codificación del texto de redirección en lugar de la de pagina a la que ha sido redireccionado. La consecuencia de esto puede ser, por ejemplo, que una página en griego no se muestre correctamente.
Especificar un valor en esta variable de entorno hace que Apache omita la codificación en el texto que incluye con las redirecciones, y que esos navegadores que no funcionan correctamente muestren correctamente la página de destino.
Ejemplos
Cómo cambiar el comportamiento de clientes que se comportan de manera inapropiada
Recomendamos que incluya las siguentes líneas en el fichero httpd.conf para evitar problemas conocidos
# # Las siguientes directivas modifican el comportamiento normal de las respuestas HTTP. # La primera directiva desactiva keepalive para Netscape 2.x y para navegadores # que la simulan. Hay problemas conocidos con esos navegadores. # La segunda directiva es para Microsoft Internet Explorer 4.0b2 # que tiene un fallo en la implemantación de HTTP/1.1 y no soporta # keepalive adecuadamente cuando se usan respuestas 301 ó 302 (redirecciones). # BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 # # La siguiente directiva desactiva las respuestas HTTP/1.1 para navegadores que # violan la especificación HTTP/1.0 @@@ by not being able to grok a # basic 1.1 response @@@. # 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 almacenar entradas en registro de acceso para las imágenes
Este ejemplo evita que las peticiones de imágenes aparezcan en el registro de acceso. Puede ser modificada fácilmente para evitar que se registren entradas de peticiones de directorios, o provenientes de determinados clientes.
SetEnvIf Request_URI \.gif image-request SetEnvIf Request_URI \.jpg image-request SetEnvIf Request_URI \.png image-request CustomLog logs/access_log common env=!image-request
Evitar el "robo de imagenes"
Este ejemplo muestra como evitar que otras webs usen las imágenes de su servidor para sus páginas. Esta configuración no se recomienda, pero puede funcionar en determinadas circunstancias. Asumimos que que todas sus imágenes están en un directorio llamado /web/images.
SetEnvIf Referer "^http://www.example.com/" local_referal # Allow browsers that do not send Referer info SetEnvIf Referer "^$" local_referal <Directory /web/images> Order Deny,Allow Deny from all Allow from env=local_referal </Directory>
Para obtener más información sobre esta técnica, consulte el tutorial de ApacheToday " Keeping Your Images from Adorning Other Sites".