Variables httpd.conf: ¿Cuál es la diferencia entre $ {var} y% {var}?


7

¿Cuál es la diferencia entre ${var}y %{var}en httpd.conf?

¿Cómo y cuándo se usaría ${}y %{}?

http://httpd.apache.org/docs/2.4/configuring.html menciona:

Los valores de las variables definidas con Definir o variables de entorno de shell pueden usarse en líneas de archivos de configuración utilizando la sintaxis $ {VAR}.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html menciona:

Variables de servidor: Estas son variables de la forma% {NAME_OF_VARIABLE}

y

Expansiones RewriteMap: Estas son expansiones de la forma $ {mapname: key | default}.

Se ${VAR}usará en todas partes en httpd.conf, excepto en las directivas mod_rewrite (como RewriteCond, RewriteRule pero excepto en las expansiones RewriteMap que se usan ${}como en RewriteRule ^ / ex /(.*) $ {examplemap: $ 1} )

¿Se SetEnvIfusaría una variable establecida en httpd.conf usando Directiva, para usar en la misma httpd.conf, ${var}excepto cuando la variable se usa con directivas mod_rewrite, donde la variable se usaría como %{var}?

Respuestas:


5

¿Cuál es la diferencia entre $ {var} y% {var} en httpd.conf?

Prácticamente todo. No hay una regla estricta que diga " $hace x, %hace y", porque hacen cosas diferentes dependiendo de dónde y cómo se usan.

¿Se utilizará $ {VAR} en todas partes en httpd.conf, excepto en las directivas mod_rewrite

No: ${VAR}se aplica como reemplazo en cada ubicación a lo largo de la configuración, incluso en una línea relacionada con mod_rewrite. Estos solo se pueden definir al inicio utilizando la -Dopción pasada al binario httpd, o la Definedirectiva.

Esto se puede hacer porque esas variables no deben contener un :carácter, mientras que el RewriteMapuso debe contener un :carácter. Esto permite $que se use de maneras extremadamente diferentes sin conflicto: el analizador lo ve :y sabe que se supone que no debe reemplazar eso.

¿Se usaría una variable establecida en httpd.conf usando la Directiva SetEnvIf, para usar en la misma httpd.conf, como $ {var} excepto cuando la variable se usa con directivas mod_rewrite, donde la variable se usaría como% {var}?

No. Las variables de entorno no son las mismas que las variables establecidas mediante -Do Define: son un contexto por solicitud completamente separado (esas son las que está configurando SetEnvIf), que solo usarán ciertas directivas. Se mencionan específicamente donde se admiten: en mod_rewrite son %{ENV:variable}, en los registros son %{variable}e, y muchas directivas tienen una verificación lógica que se parece env=variable.


Así que básicamente; Es un desastre confuso: un testimonio de la historia del servidor web en las últimas dos décadas. Probablemente lo principal que te confunde es que la sintaxis de mod_rewrite no se extiende a ninguna otra parte de la configuración de ninguna manera; Todo es diferente. El punto principal de todo esto es que no hay una 'regla' gobernante para que todo esto tenga sentido: un $en un lugar significa algo completamente diferente de $otro en otro.

Algunos puntos de referencia útiles:

  1. Si está buscando establecer una variable estáticamente cuando Apache se inicia, use Definey ${VAR}para reemplazar una vez, en el inicio de Apache. Esto es principalmente útil para cuando desea hacer algo como compartir archivos de configuración entre un entorno de desarrollo y producción, pero no debe confundirse con el uso de $from RewriteMap, que siempre contiene un :.
  2. Si está buscando trabajar con variables en solicitudes específicas, entonces las variables de entorno son lo que busca, pero no puede hacer suposiciones sobre la sintaxis que usará para obtenerlas cuando se use con una directiva específica. Deberá verificar la documentación de esa directiva.
  3. Cuando mod_rewrite esté en cuestión, deseche todo lo que creía saber sobre las variables y su sintaxis. Tiene su propio conjunto de variables %{VAR}, puede obtener sus variables de entorno 'normales' con %{ENV:VAR}, y puede establecer variables de entorno con [E=VAR].

¡Guauu! gracias por tan largo escribir! Me llevará un tiempo digerir esto. Es bastante extraño que los documentos de Apache no documenten esto en un solo lugar, esto debe ser bastante confuso para muchos novatos.
X10

Sí, sus documentos no son malos para conceptos específicos, pero las cosas de 'panorama general' como esta son mucho menos claras.
Shane Madden

1

He mirado el código fuente de mod_rewrite, y encontré que las notas en los comentarios (función do_expand):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

parece que% son para variables exactas, mientras que $ son para búsquedas en tablas hash ("mapas"). Además, todas las expansiones mod_rewrite son completamente independientes del núcleo: toda la expansión se realiza en el módulo por sí misma.

Pensé antes, pero eso estaba mal:

$ {} vars son entornos de uso del proyecto y se evalúan en el momento del análisis de la configuración.

Los% {} vars son entornos de uso de solicitud y se evalúan en el momento en que se analiza la solicitud. mod_rewrite utiliza% {} symantic para evitar la interpolación en tiempo de configuración realizada por httpd core.


Gracias, ¿podría incluir el enlace a la documentación original para esto y, si es posible, un enlace a un tutorial?
X10

Nunca he visto eso en texto claro en la documentación. Así es como he entendido por qué se hizo eso. Y eso estaba mal :)
datacompboy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.