sábado, 28 de agosto de 2010

Diferenciando IP externas de internas para Moodle

Tratando de instalar la plataforma Moodle en mi centro, me encontré con el problema de que si ponía como IP de Moodle la IP pública en el fichero config.php y ajustaba la NAT del router todo iba bien... desde fuera de la red del centro. Pero desde la LAN interna se redireccionaba al programade configuración del router que no ejercía NAT por no ser una llamada externa. Esto provocó que la simple entrada:

 $CFG->wwwroot   = IP_Pública;  //Por ejemplo 81.94.107.111

no funcionara. Claro, tampoco puedo sustituir la IP_Pública por la IP interna del servidor pues eso provoca que la plataforma deje de funcionar desde fuera de la LAN (Bueno, funciona pero no carga bien las CSS) Así que tampoco vale la entrada en config.php:

$CFG->wwwroot   = IP_interna_del _servidor; //Por ejemplo 192.168.1.100

Soluciones hay varias. La más evidente es colocar la plataforma en un servidor externo con lo que me olvido de todos los problemas. Pero si nos apetece tener todo en nuestro servidor, podemos aplicar un simple IF en PHP para detectar si la máquina que se está conectando es de una red interna o externa. Así, y suponiendo que la red interna tiene IPs tipo 192.168.1.XXX (si no es así hay que cambiar la expresión regular), el código a meter en config.php sería:

        $client_ip =$_SERVER['REMOTE_ADDR'];

    if ( preg_match("/^192\\.168\\.1\\.*/",  $client_ip) )
    {
            $CFG->wwwroot   = 'http://192.168.1.100';
    }
    else
    {
            $CFG->wwwroot   = 'http://81.94.107.111';
    } 

$_SERVER['REMOTE_ADDR'] devuelve la IP remota (no nos preocupan posibles proxies para este caso)

preg_match comprueba si una cadena (en este caso $client_ip) encaja en una expresión regular (en este caso la expresioń regular busca IP que empiecen por 192.168.1.). Si coinciden se usa la dirección interna pues estamos en la red interna. Si no, se usa la dirección externa.

La idea la obtuve de este artículo de EsLoMas (¡Gracias!).

No hay comentarios:

Publicar un comentario