Como compartir Chamilo en el aula

Un elemento posiblemente molesto de ChamiloLMS es que solo puede responder a una dirección a la vez. Por ejemplo, si responder en http://localhost/, entonces al cargarlo desde otra máquina a través de una dirección IP, aparecerá sin diseño, lo cual se ve muy feo y es muy impráctico. Algo como en la captura siguiente.

broken-style-chamilo

Esto se debe a que Chamilo tiene una parte de código que surge de otros proyectos más antiguos, y que era poco común en esta época tener la facilidad de instalar un servidor web en una máquina “normal” de profesor. También era más difícil obtener la dirección desde una URL o las cabeceras HTTP de una manera confiable.

Estos días, no obstante, es mucho más confiable este proceso y se puede recuperar esta información (en PHP) via $_SERVER[‘HTTP_HOST’], por lo que se hace posible modificar el archivo de configuración de Chamilo (main/inc/conf/configuration.php para Chamilo 1.9 or app/config/configuration.php para Chamilo 1.10 y 1.11) de la manera siguiente:

  $_configuration['root_web'] = 'http://localhost/';
  if (!empty($_SERVER['HTTP_HOST'])) {
    $_configuration['root_web'] = 'http://'.$_SERVER['HTTP_HOST'].'/';
  }

Esto puede que tenga un impacto sobre la seguridad de su portal. Todavía no lo hemos verificado, por lo que no recomendamos este cambio en servidores críticos. No obstante, es posible que no lo haga dado que otros sistemas similares (como Drupal, Joomla, etc) también hacen uso de HTTP_HOST para determinar el camino de la raíz web.

Una posible alteración a esta configuración sería de asignar manualmente una lista de hosts autorizados.

Es probable que en futuras versiones de Chamilo (a partir de la 2.0) eliminemos este problema, pero no estamos ahí todavía.

Si usa HTTPS (lo cual significa que tendría que tener un certificado para cada una de las URLs usadas), tendrá que incluir también una revisión de $_SERVER[‘SERVER_PROTOCOL’] para identificar los casos que usarían un certificado SSL.

Kudos para GMP Perú por evidenciar este requerimiento y hacernos trabajar en ello para el beneficio de todos.
BT#5737

Otros nos reportaron que, al momento de usar un “navegador seguro” (un software propietario, al parecer), encontraron problemas para pasar a la pregunta siguiente en un ejercicio.

Aparentemente, el dicho “navegador seguro” intenta forzar el uso de HTTPS encima de una comunicación no-HTTPS, o de hacer un proxy de las URLs de alguna manera. Esto cae en el mismo tipo de problema, ya que el servidor no acepta distintas URLs.

Para solucionarlo, tuvimos que incluir el procesamiento HTTPS en el ejemplo anterio:
 
  $_configuration['root_web'] = 'http://localhost/';
  if (!empty($_SERVER['HTTP_HOST'])) {
    if (!empty($_SERVER['HTTPS'])) {
      $_configuration['root_web'] = 'https://'.$_SERVER['HTTP_HOST'].'/';
    } else {
      $_configuration['root_web'] = 'http://'.$_SERVER['HTTP_HOST'].'/';
    }
  }

Si pensó que eso no podría volverse más complejo, tendremos que desilusionarlo porque, en ciertos casos, Chamilo puede estar detrás de un reverse-proxy en HTTPS y en este caso *no* recibe el valor correcto en $_SERVER[‘HTTPS’], pero sí un valor “https” dentro de la variable $_SERVER[‘HTTP_X_FORWARDED_PROTO’] (o cualquier otra que haya sido configurada a nivel del servidor proxy). En este caso, es necesario añadir dos condiciones en el bloque anterior:

  $_configuration['root_web'] = 'http://localhost/';
  if (!empty($_SERVER['HTTP_HOST'])) {
    if (!empty($_SERVER['HTTPS']) or (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) {
      $_configuration['root_web'] = 'https://'.$_SERVER['HTTP_HOST'].'/';
    } else {
      $_configuration['root_web'] = 'http://'.$_SERVER['HTTP_HOST'].'/';
    }
  }

 

Y a raíz de lo anterior, varios requerimientos nuevos fueron revelados. Otro cliente de BeezNest quiso soportar una dirección IP local con una subcarpeta en la cual se encuentra Chamilo (en una dirección IP local como http://172.34.13.45/chamilo) *además* de soportarlo a través de un dominio público sin subcarpeta como http://my.chamilo.net/.

Esto puede causar problemas en Chamilo, ya que diferenciamos claramente entre instalaciones en una subcarpeta e instalaciones en una carpeta “raíz” (razón por la cual tenemos un parámetro “url_append” que indica las subcarpetas).

No obstante, la configuración siguiente ha sido comprobada y parece que no genera mayores problemas:

  // "/chamilo" es la subcarpeta y "172.34.13.45" es la IP local
  // "my.chamilo.net" es el dominio "raíz"
  $_configuration['url_append'] = '/chamilo';
  $_configuration['root_web'] = 'http://172.34.13.45/chamilo/';
  if (!empty($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] != '172.34.13.45') {
    if (!empty($_SERVER['HTTPS'])) {
      $_configuration['root_web'] = 'https://my.chamilo.net/';
    } else {
      $_configuration['root_web'] = 'http://my.chamilo.net/';
    }
    $_configuration['url_append'] = '';
  }

Esta configuración *no* funcionaría, no obstante, si solo hay un certificado SSL y que se trata de usar HTTPS con la dirección IP (necesita un nombre de dominio para un certificado SSL público).

Caso especial con Wamp

También nos han reportado que al usar Wamp en Windows sin dominio particular (como por ejemplo en http://localhost/), Wamp lo obliga a usar una configuración en modo sub-carpeta tal como: http://localhost/chamilo/

De ser el caso, un efecto raro puede ser observado en el cual el modo de funcionamiento normal de Chamilo, y en particular del parámetro “url_append”, causa problemas. Luego de un proceso de pruebas y errores, llegamos a la configuración siguiente que parece funcionar en una instalación clásica de Wamp:

  $_configuration['root_web'] = 'http://localhost/chamilo/';
  if (!empty($_SERVER['HTTP_HOST'])) {
    $_configuration['root_web'] = 'http://'.$_SERVER['HTTP_HOST'].'/chamilo/';
  }
  $_configuration['url_append'] = '';

No existe una explicación muy lógica para esto todavía, pero ha funcionado y lo dejaremos decidir si quiere usarlo o no.

Es importante notar también, para los que usan Wamp con Apache 2.4.*, que hay que configurar unas cosas adicionales para que su instalación pueda ser usada desde otras máquinas, incluyendo el uso de la directiva “Require all granted”. Esto no se cubre en este artículo, pero encontrará abundante documentación de otros lados, como aquí por ejemplo (en inglés): http://stackoverflow.com/a/23385021/6499848

Comments

Buena publicación con el código:
$_configuration[‘root_web’] = ‘http://localhost/’;
if (!empty($_SERVER[‘HTTP_HOST’])) {
if (!empty($_SERVER[‘HTTPS’]) or (!empty($_SERVER[‘HTTP_X_FORWARDED_PROTO’]) && $_SERVER[‘HTTP_X_FORWARDED_PROTO’] == ‘https’)) {
$_configuration[‘root_web’] = ‘https://’.$_SERVER[‘HTTP_HOST’].’/’;
} else {
$_configuration[‘root_web’] = ‘http://’.$_SERVER[‘HTTP_HOST’].’/’;
}
}
Trabaja bien para :
localhost para una pc que tiene el servidor
ip privada para los pc dentro de la red local

Mi pregunta es como se modifica el código php para poder trabajar con la ip publica. para que una pc fuera del red local pueda ingresar.
$_configuration[‘root_web’] = ‘https://ip-publica/’;