7

se utiliza la siguiente función para detectar automáticamente si estamos en una máquina internamente o en un servidor en vivo y luego elegir las configuraciones apropiadas para varios componentes:Detección automática ambiente interno/externo desarrollo

function devIsLocal(){ 

    $res=false; 

    $http_host=$_SERVER['HTTP_HOST']; 

    if($http_host=='localhost')$res=true; 
    if($http_host=='127.0.0.1')$res=true; 
    if(substr($http_host,-4)=='.lan')$res=true; 
    if(strpos($http_host, '.')===false)$res=true; 

    return($res); 

} 

Como se puede ver que solo se basa en el valor HTTP_HOST.

Por supuesto, si utiliza algún tipo de host virtual localmente como example.com, la función será engañada.

¿Hay alguna otra forma de engañar a la función? y ¿qué otras variables/lugares podríamos ver para determinar dónde estamos?

Respuesta

10
'127.0.0.1' == $_SERVER["REMOTE_ADDR"] 

Esta voluntad nunca evaluar como TRUE en su sistema en vivo.:)

+2

Tampoco lo hará si accede a su servidor local con su dirección IP pública. –

+0

+1 por mencionar la comprobación de la dirección IP. Andy tiene razón, también tendremos que agregar los intervalos de IP reservados para intranets. ¿Funcionará esto entonces? – zaf

+0

@zaf: Sí, por supuesto. Andy lo malinterpretó como una solución completa, mientras que yo solo quería mostrar el concepto general. Tal vez tengo que ser más explícito en el futuro ...: -/ – fuxia

1

Crea y luego busca un archivo que solo existe en el sistema de archivos del servidor en vivo.

De acuerdo, sus entornos deben ser lo más similares posible; Lo que sugiero es algo como esto: en el directorio/var/environment /, tenga un archivo llamado {devel | test | qa | staging | live}, dependiendo del servidor en el que se encuentre, entonces simplemente verifique el nombre del archivo.

Por supuesto, debe excluir este archivo del control de versiones y del proceso de compilación que pueda tener.

+0

Esta es otra avenida. En lugar de crear un archivo (y luego tener que recordar el hecho) pensé en buscar pistas en el sistema de archivos, como directorios personales, etc., pero a veces el sistema de archivos de los servidores de producción es idéntico al servidor de prueba. – zaf

+0

De hecho. Quise crear/var/environment/devel en devel,/var/environment/live en vivo, etc. Estos archivos no necesitan tener ningún contenido y no deben usarse para nada además de distinguir los entornos. Editado mi respuesta para aclarar. – Piskvor

+0

Así fue como fui con mi proyecto más reciente. Simplemente creé un archivo llamado desarrollo.txt y lo busqué en mi archivo config.php. Es simple, explícito y no requiere cambios fuera del directorio del proyecto. –

0

Por supuesto, si tiene un host virtual local como example.com, la función será engañada.

Además, si el host no es local sino que usa una tarjeta widlcard o vnf defn predeterminada y el usuario agrega la dirección IP localmente al archivo hosts.

recomiendo tener un directorio de la ruta de inclusión que también existe en vivo, pero no se replica allí - y simplemente tienda:

function getEnv(){ 
    return 'Live'; 
} 

o

function getEnv(){ 
    return 'Test'; 
} 

Si ambos envs están en el mismo servidor: aún puede hacer esto configurando include_path en Apache config o .htaccess.

Esto también le permite separar datos env específicos potencialmente sensibles, como hosts/contraseñas de bases de datos y claves de cifrado.

C.

+0

Podríamos simplemente verificar si existe un directorio, por ejemplo, el directorio de inicio de algún usuario. Idea interesante. Pero a veces un diseño de sistema de archivos de servidores de producción dedicado refleja el servidor de prueba interno. – zaf

15

Establezca una variable de entorno en su configuración de host virtual Apache. Esta es la forma en que lo hace Zend Framework.

Véase el ZF quick start guide para un ejemplo (la sección "Crear un host virtual".)

En su httpd.conf o un archivo .htaccess, poner:

SetEnv APPLICATION_ENV "development" 

Luego, en su aplicación, utilizar la función getenv para obtener el valor:

$environment = getenv("APPLICATION_ENV"); 
if ($environment == "development") 
{ 
    // do development stuff 
} 
else if ($environment == "live") 
{ 
    // do live stuff 
} 
+0

+1 para mayor confiabilidad. Agregué más opciones en mi respuesta – Cez

+0

A veces no está permitido editar httpd.conf. Tener un archivo .htaccess que contenga un valor clave para indicar el entorno no es automático. – zaf

+0

@zaf: ¿puede detallar "tener un archivo .htaccess que contenga un valor clave para indicar que el entorno no es automático"? Personalmente, considero que esta es la solución más elegante, pero los hosts pueden restringir lo que se puede hacer en el archivo .htaccess. ¿Esto es lo que quieres decir? –

3

Agregando a Andy Shellam's answer ..

Si está utilizando mod_vhost_alias, o tiene varios dominios con la misma raíz del documento (virtual), puede establecer la variable dependiente de los parámetros, por ejemplo,

SetEnvIf SERVER_ADDR x.x.x.x APPLICATION_ENV=development 
SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development 
+0

¿'SetEnvIf' no utiliza expresiones regulares para evaluar la condición? Si es así, necesitarías escapar del '.' ¿no es así? –

+0

@ Lèsemajesté Es cierto que la documentación muestra los períodos de escape, pero parece funcionar bien de cualquier manera siempre que he usado SetEnvIf – Cez

+0

Supongo que tiene sentido, ya que el '.' coincidiría con cualquier carácter, incluido un punto, y porque las direcciones IP siguen una formato fijo no causaría ningún otro problema en este caso. –

Cuestiones relacionadas