¿Cómo puedo usar SetEnvIf para establecer una variable basada en el Http Host?

11

Estoy tratando de establecer una variable en Apache

ENV = DEV si el host http es la URL del desarrollador

o

ENV = PRD si el host http es la URL prd

y luego use $ _SERVER ['ENV'] para crear algunas ramas lógicas

Hasta ahora ninguno de estos me ha funcionado y tenemos el módulo setenvif instalado

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

¿Cuál es la forma correcta de hacer esto?

qodeninja
fuente

Respuestas:

15

Echando un vistazo rápido a la documentación :

La directiva SetEnvIf define variables de entorno basadas en los atributos de la solicitud. El atributo especificado en el primer argumento puede ser una de tres cosas:

Un campo de encabezado de solicitud HTTP (consulte RFC2616 para obtener más información sobre estos); por ejemplo: Host, User-Agent, Referer y Accept-Language. Se puede usar una expresión regular para especificar un conjunto de encabezados de solicitud.

Entonces, ciertamente es posible hacer que una variable de entorno sea condicional en el Hostencabezado. Parece que está intentando usar los encabezados Referero Remote_Host, ninguno de los cuales es exactamente lo que desea (aunque en teoría Refererdebería contener el valor del Hostencabezado en la mayoría de los casos). Remote_Hostsería el nombre de host del cliente que realiza la solicitud, que no es en absoluto lo que desea (y en la mayoría de las configuraciones simplemente no estaría disponible, ya que es típico tener las búsquedas de DNS desactivadas por razones de rendimiento).

Intenta algo como esto:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... y luego use $ _SERVER ['ENV'] para crear algunas ramas lógicas

Pero tenga en cuenta también que simplemente puede hacer referencia al valor del Hostencabezado directamente en PHP sin pasar por este engaño; $_SERVER['HTTP_HOST']Tendrás exactamente lo que quieres.

larsks
fuente
Hermoso. Esto me permite escribir reglas personalizadas para requerir contraseñas cuando se conecta a ciertos hosts, pero no a otros (es decir, proteger el cuadro de ensayo cuando una máquina virtual se clona en varias instancias de Amazon EC2, pero no escribir recetas de Chef personalizadas). Muy útil, si es difícil de buscar, funcionalidad.
Eric L.
1
Los SetEnvIfdocumentos dicen que el tercer parámetro es una expresión regular, ¿no deberían escaparse los puntos en el nombre de dominio con una barra diagonal inversa? ¿O si cita el valor entre comillas dobles hace que Apache lo trate como una cadena literal?
jakub.g
@ jakub.g Sí, son una expresión regular y deben escaparse. En este caso, dado que un punto coincide con cualquier carácter individual, una "www-dev.example.com"expresión regular también coincidirá con nombres de host inesperados, como www-dev-example.com. Obtendrás los partidos esperados y más. He actualizado el ejemplo ahora.
Martijn Heemels