Hay dos tipos de variables de entorno que afectan al servidor HTTP Apache.

Primero, están las variables de entorno controladas por el sistema operativo subyacente. Estos se establecen antes de que se inicie el servidor. Se pueden usar en expansiones en archivos de configuración y, opcionalmente, se pueden pasar a scripts CGI y SSI usando la directiva PassEnv.

En segundo lugar, el servidor HTTP Apache proporciona un mecanismo para almacenar información en variables con nombre que también se denominan Variables de entorno. Esta información se puede utilizar para controlar diversas operaciones, como el registro o el control de acceso. Las variables también se utilizan como mecanismo para comunicarse con programas externos como scripts CGI. Este documento analiza diferentes formas de manipular y utilizar estas variables.

Aunque estas variables se denominan Variables de entorno, no son las mismas que las variables de entorno controladas por el sistema operativo subyacente. En cambio, estas variables se almacenan y manipulan en una estructura interna de Apache. Solo se convierten en variables de entorno del sistema operativo reales cuando se proporcionan a los scripts CGI y los scripts de inclusión del lado del servidor. Si desea manipular el entorno del sistema operativo en el que se ejecuta el servidor, debe utilizar los mecanismos de manipulación del entorno estándar proporcionados por el shell de su sistema operativo.

Configuración de variables de entorno

Módulos relacionados Directivas relacionadas

Manipulación básica del entorno

La forma más básica de establecer una variable de entorno en Apache es usar el incondicional SetEnv directiva. Las variables también se pueden pasar desde el entorno del shell que inició el servidor utilizando el PassEnv directiva.

Configuración condicional por solicitud

Para mayor flexibilidad, las directivas proporcionadas por mod_setenvif Permitir que las variables de entorno se establezcan por solicitud, condicionadas a las características de solicitudes particulares. Por ejemplo, una variable podría establecerse solo cuando un navegador específico (Usuario-Agente) realiza una solicitud, o solo cuando un Referente específico [sic] se encuentra el encabezado. Aún más flexibilidad está disponible a través del mod_rewrite‘s RewriteRule que usa el [E=...] opción para establecer variables de entorno.

Identificadores únicos

Finalmente, mod_unique_id establece la variable de entorno UNIQUE_ID para cada solicitud a un valor que se garantiza que será único en “todas” las solicitudes en condiciones muy específicas.

Variables CGI estándar

Además de todas las variables de entorno establecidas dentro de la configuración de Apache y pasadas desde el shell, los scripts CGI y las páginas SSI se proporcionan con un conjunto de variables de entorno que contienen metainformación sobre la solicitud según lo requiera el Especificación CGI.

Algunas advertencias

  • No es posible anular o cambiar las variables CGI estándar utilizando las directivas de manipulación del entorno.
  • Cuando suexec se utiliza para iniciar scripts CGI, el entorno se limpiará a un conjunto de a salvo variables antes de que se inicien los scripts CGI. La lista de a salvo las variables se definen en tiempo de compilación en suexec.c.
  • Por razones de portabilidad, los nombres de las variables de entorno pueden contener solo letras, números y el carácter de subrayado. Además, es posible que el primer carácter no sea un número. Los caracteres que no coincidan con esta restricción serán reemplazados por un guión bajo cuando se pasen a scripts CGI y páginas SSI.
  • Un caso especial son los encabezados HTTP que se pasan a los scripts CGI y similares a través de variables de entorno (ver más abajo). Se convierten a mayúsculas y solo los guiones se reemplazan por guiones bajos; si el encabezado contiene cualquier otro carácter (no válido), todo el encabezado se elimina silenciosamente. Consulte a continuación para obtener una solución.
  • los SetEnv La directiva se retrasa durante el procesamiento de la solicitud, lo que significa que directivas como SetEnvIf y RewriteCond no verá las variables establecidas con él.
  • Cuando el servidor busca una ruta a través de un sub-solicitud como buscar un DirectoryIndex o generando una lista de directorio con mod_autoindex, las variables de entorno por solicitud son no heredado en la subquest. Adicionalmente, SetEnvIf las directivas no se evalúan por separado en la sub-solicitud debido a las fases de API mod_setenvif toma acción en.

Usar variables de entorno

Módulos relacionados Directivas relacionadas

Scripts CGI

Uno de los usos principales de las variables de entorno es comunicar información a los scripts CGI. Como se mencionó anteriormente, el entorno pasado a los scripts CGI incluye metainformación estándar sobre la solicitud además de cualquier variable establecida dentro de la configuración de Apache. Para obtener más detalles, consulte el tutorial de CGI.

Páginas SSI

Documentos analizados por servidor (SSI) procesados ​​por mod_include‘s INCLUDES El filtro puede imprimir variables de entorno usando el echo y puede usar variables de entorno en elementos de control de flujo para condicionar partes de una página a las características de una solicitud. Apache también proporciona páginas SSI con las variables de entorno CGI estándar como se discutió anteriormente. Para obtener más detalles, consulte el tutorial de SSI.

Control de acceso

El acceso al servidor se puede controlar en función del valor de las variables de entorno utilizando el allow from env= y deny from env= directivas. En combinación con SetEnvIf, esto permite un control flexible del acceso al servidor en función de las características del cliente. Por ejemplo, puede utilizar estas directivas para denegar el acceso a un navegador en particular (Usuario-Agente).

Registro condicional

Las variables de entorno se pueden registrar en el registro de acceso utilizando el LogFormat opción %e. Además, la decisión de registrar o no las solicitudes se puede tomar en función del estado de las variables de entorno utilizando la forma condicional del CustomLog directiva. En combinación con SetEnvIf esto permite un control flexible de las solicitudes que se registran. Por ejemplo, puede optar por no registrar solicitudes de nombres de archivo que terminen en gif, o puede optar por registrar solo las solicitudes de clientes que están fuera de su subred.

Encabezados de respuesta condicional

los Header La directiva puede usar la presencia o ausencia de una variable de entorno para determinar si un determinado encabezado HTTP se colocará o no en la respuesta al cliente. Esto permite, por ejemplo, enviar un determinado encabezado de respuesta solo si se recibe un encabezado correspondiente en la solicitud del cliente.

Activación de filtro externo

Filtros externos configurados por mod_ext_filter utilizando el ExtFilterDefine La directiva puede activarse condicionalmente en una variable de entorno utilizando la disableenv= y enableenv= opciones.

Reescritura de URL

los %ENV:variable forma de TestString en el RewriteCond permite mod_rewriteMotor de reescritura para tomar decisiones condicionadas a variables de entorno. Tenga en cuenta que las variables accesibles en mod_rewrite sin el ENV: prefix no son realmente variables de entorno. Más bien, son variables especiales para mod_rewrite al que no se puede acceder desde otros módulos.

Variables de entorno de propósito especial

Los problemas de interoperabilidad han llevado a la introducción de mecanismos para modificar la forma en que Apache se comporta cuando habla con clientes particulares. Para que estos mecanismos sean lo más flexibles posible, se invocan definiendo variables de entorno, normalmente con BrowserMatch, aunque SetEnv y PassEnv también podría usarse, por ejemplo.

downgrade-1.0

Esto obliga a que la solicitud se trate como una solicitud HTTP / 1.0 incluso si estaba en un dialecto posterior.

force-gzip

Si tienes el DEFLATE filtro activado, esta variable de entorno ignorará la configuración de aceptación de codificación de su navegador y enviará una salida comprimida incondicionalmente.

forzar no variar

Esto causa cualquier Vary campos que se eliminarán del encabezado de respuesta antes de que se envíe de vuelta al cliente. Algunos clientes no interpretan este campo correctamente; establecer esta variable puede solucionar este problema. Establecer esta variable también implica fuerza-respuesta-1.0.

fuerza-respuesta-1.0

Esto fuerza una respuesta HTTP / 1.0 a los clientes que realizan una solicitud HTTP / 1.0. Originalmente se implementó como resultado de un problema con los proxies de AOL. Algunos clientes HTTP / 1.0 pueden no comportarse correctamente cuando se les da una respuesta HTTP / 1.1, y esto puede usarse para interoperar con ellos.

gzip-solo-texto / html

Cuando se establece en un valor de “1”, esta variable deshabilita la DEFLATE filtro de salida proporcionado por mod_deflate para tipos de contenido distintos de text/html. Si prefiere utilizar archivos comprimidos estáticamente, mod_negotiation también evalúa la variable (no solo para gzip, sino para todas las codificaciones que difieren de “identidad”).

no-gzip

Cuando se establece, el DEFLATE filtro de mod_deflate se apagará y mod_negotiation se negará a entregar recursos codificados.

sin caché

Disponible en las versiones 2.2.12 y posteriores

Cuando se establece, mod_cache no guardará una respuesta que de otro modo se pueda almacenar en caché. Esta variable de entorno no influye en si se entregará una respuesta que ya está en la caché para la solicitud actual.

nokeepalive

Esto deshabilita KeepAlive cuando se establece.

prefiero el idioma

Esto influye mod_negotiationcomportamiento. Si contiene una etiqueta de idioma (como en, ja o x-klingon), mod_negotiation intenta ofrecer una variante con ese idioma. Si no existe tal variante, se aplica el proceso de negociación normal.

redirigir con cuidado

Esto obliga al servidor a tener más cuidado al enviar una redirección al cliente. Esto se usa normalmente cuando un cliente tiene un problema conocido en el manejo de redireccionamientos. Esto se implementó originalmente como resultado de un problema con el software WebFolders de Microsoft que tiene un problema al manejar redirecciones en recursos de directorio a través de métodos DAV.

suprimir-error-charset

Disponible en versiones posteriores a 2.0.54

Cuando Apache emite un redireccionamiento en respuesta a una solicitud del cliente, la respuesta incluye texto real que se mostrará en caso de que el cliente no pueda (o no) siga automáticamente el redireccionamiento. Apache normalmente etiqueta este texto de acuerdo con el conjunto de caracteres que utiliza, que es ISO-8859-1.

Sin embargo, si la redirección es a una página que usa un juego de caracteres diferente, algunas versiones de navegador defectuosas intentarán usar el juego de caracteres del texto de redirección en lugar de la página real. Esto puede resultar en que el griego, por ejemplo, se traduzca incorrectamente.

La configuración de esta variable de entorno hace que Apache omita el juego de caracteres para el texto de redirección, y estos navegadores rotos usarán correctamente el de la página de destino.

Nota de seguridad

El envío de páginas de error sin un juego de caracteres especificado puede permitir un ataque de secuencias de comandos entre sitios para navegadores existentes (MSIE) que no siguen la especificación HTTP / 1.1 e intentan “adivinar” el juego de caracteres a partir del contenido. Dichos navegadores pueden engañarse fácilmente para que utilicen el conjunto de caracteres UTF-7, y el contenido UTF-7 de los datos de entrada (como el URI de solicitud) no se escapará mediante los mecanismos de escape habituales diseñados para evitar ataques de secuencias de comandos entre sitios.

force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pool

Estas directivas alteran el comportamiento del protocolo de mod_proxy. Ver el mod_proxy y mod_proxy_http documentación para más detalles.

Ejemplos de

Pasando encabezados rotos a scripts CGI

A partir de la versión 2.4, Apache es más estricto sobre cómo los encabezados HTTP se convierten en variables de entorno en mod_cgi y otros módulos: anteriormente, los caracteres no válidos en los nombres de los encabezados se traducían simplemente a guiones bajos. Esto permitió algunos posibles ataques de secuencias de comandos entre sitios mediante la inyección de encabezados (consulte Errores web inusuales, diapositiva 19/20).

Si tiene que dar soporte a un cliente que envía encabezados rotos y que no se pueden arreglar, una solución simple involucra mod_setenvif y mod_headers le permite aceptar estos encabezados:

# 
# The following works around a client sending a broken Accept_Encoding
# header.
#
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
RequestHeader set Accept-Encoding %fix_accept_encodinge env=fix_accept_encoding

Cambiar el comportamiento del protocolo con clientes que se portan mal

Las versiones anteriores recomendaban que se incluyeran las siguientes líneas en httpd.conf para tratar los problemas conocidos del cliente. Dado que los clientes afectados ya no se ven en la naturaleza, es probable que esta configuración ya no sea necesaria.

#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and browsers that
# spoof it. There are known problems with these browser implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect) responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#
# The following directive disables HTTP/1.1 responses to browsers which
# are in violation of the HTTP/1.0 spec by not being able to understand 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 registre solicitudes de imágenes en el registro de acceso

Este ejemplo evita que las solicitudes de imágenes aparezcan en el registro de acceso. Se puede modificar fácilmente para evitar el registro de directorios particulares o para evitar el registro de solicitudes provenientes de hosts particulares.

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

Prevenir el “robo de imágenes”

Este ejemplo muestra cómo evitar que las personas que no están en su servidor usen imágenes en su servidor como imágenes en línea en sus páginas. Esta no es una configuración recomendada, pero puede funcionar en circunstancias limitadas. Suponemos 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

    Require env local_referal

Para obtener más información sobre esta técnica, consulte el “Evitar que sus imágenes adornen otros sitios“tutorial sobre ServerWatch.