本帖最后由 otherbank 于 2011-9-7 15:46 编辑
发现Discuz! X2有如下一个BUG:
1,将discuz安装在二级目录下,比如bbs目录;
2,在二级目录下按教程安装Discuz! X2;
3,设置游客不能访问;
4,访问论坛: http://127.0.0.1/bbs/时自动跳到登录界面:http://127.0.0.1/bbs/member.php?mod=logging&action=login&referer=%2Fupload%2Fforum.php;填写用户名和密码登录,然后跳转地址到http://127.0.0.1/bbs//bbs/forum.php目录错误不能打开页面。
(按这种方式访问,即使在网站根目录下安装最后也会跳转到http://127.0.0.1//forum.php这个页面,也比正常访问多一个“/”)
就解决这个问题的方法进行简单描述:
1、登录的地址是http://127.0.0.1/bbs/member.php?mod=logging&action=login&referer=%2Fbbs%2Fforum.php这个,先找到入口文件/member.php,
2、根据代码require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php';知道用户登录模组文件是/source/module/member/member_logging.php,
3,member_logging.php文件实例化类logging_ctl,找到类的原型在/source/module/class/class_member.php文件
4、根据$method = 'on_'.$_G['gp_action'];找到调用的类的函数function on_login();
5、根据代码
- $referer = dreferer();
- $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
- $param = array('username' => $_G['member']['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['member']['uid']);
- showmessage('login_succeed', $referer ? $referer : './', $param, array('showdialog' => 1, 'locationtime' => true, 'extrajs' => $ucsynlogin));
复制代码 又知道函数showmessage是弹窗成功信息并跳转到$referer页面,可知$referer 的页面链接是有问题,
6,由$referer = dreferer();而来,所以问题出在function dreferer()函数,此函数在文件/source/module/function/function_core.php,找到1748行函数function dreferer(),知道$referer的来由在语句
elseif(empty($reurl['host'])) {
$_G['referer'] = $_G['siteurl'].'./'.$_G['referer'];
}
7,查询全局变量$_G['siteurl']和$_G['referer'],知道$_G['siteurl']指的是php文件前的目录在本例中它是http://127.0.0.1/bbs/;$_G['referer']在本例中是/bbs/forum.php文件
所以$_G['referer']=http://127.0.0.1/bbs//bbs/forum.php不存在,同理可以分析装在根目录下的论坛程序跳转后为什么多出一个“/”来
8,整个问题的解决方法很简单,无非是要修改$_G['siteurl']或$_G['referer']文件,但是修改它们的文件可能会给系统其他地方应用带来矛盾,最好的方法直接修改$_G['referer'] = $_G['siteurl'].'./'.$_G['referer']的赋值,把/source/module/function/function_core.php文件1769行代码修改为:
- $_G['referer'] = 'http://'.$_SERVER['HTTP_HOST'].$_G['referer'];
复制代码 问题就得到了解决。
|