应客户要求帮忙安装魔灯,项目组里腾不出人手,就只好自己上了。
安装好Moodle后,修改config.php如下,便可实现外网访问:

$CFG->wwwroot = 'http://'.$_SERVER['HTTP_HOST'];

问题当然没这么简单,打开网页竟然无限重定向!
无奈之下只好重拾学生时代混生活费的php,分析源码,找到了重定向的原因,在moodle/lib/setuplib.php的770多行中有个判断语句后发生页面跳转
if (($rurl['host'] !== $wwwroot['host']) or
(!empty($wwwroot['port']) and $rurl['port'] != $wwwroot['port']) or
(strpos($rurl['path'], $wwwroot['path']) !== 0)){
//略
redirect($CFG->wwwroot, get_string('wwwrootmismatch', 'error', $CFG->wwwroot), 3);
}

通过简单粗暴的echo加die调试后发现rurl的port值与wwwroot的port值不等,继续找rurl中port赋值的地方,在moodle/lib/setuplib.php的860多行的setup_get_remote_url函数中有如下赋值
$rurl['port'] = $_SERVER['SERVER_PORT'];

辛苦了半天终于找到了真正原因。由于Moodle安装在公司“云”的虚拟机中,IIS的端口号是8080,外网访问是通过映射公网IP的8088端口。在服务器上用内网访问没问题,但是通过公网IP访问时,config.php中的wwwroot取得的端口号是8088,而rurl中取得的端口号是8080,因此上面的setuplib.php中的判断语句成立,导致网页跳转到config.php中wwwroot设定的地址,然后就是新一轮的跳转,如此循环...
解决方法也很简单,不想修改源代码,于是直接将云端虚拟机IIS服务的端口号与外网映射的端口号改成一致就可以了。

Back