Posterior a de una larga compilación de información pudimos resolver esta problema que presentan algunos los lectores. Te brindamos la solución y deseamos que sea de gran apoyo.
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 ensuexec.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 comoSetEnvIf
yRewriteCond
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 conmod_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 APImod_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_rewrite
Motor 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_negotiation
comportamiento. 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_referalRequire 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.