Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Discuz! X2安装在二级目录下不能登录问题的BUG分析

[复制链接]
otherbank 发表于 2011-9-7 15:40:09 | 显示全部楼层 |阅读模式
本帖最后由 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、根据代码
  1. $referer = dreferer();
  2. $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
  3. $param = array('username' => $_G['member']['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['member']['uid']);
  4. 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行代码修改为:

  1. $_G['referer'] = 'http://'.$_SERVER['HTTP_HOST'].$_G['referer'];
复制代码
问题就得到了解决。




64243354 发表于 2011-9-7 23:44:08 | 显示全部楼层
支持下
回复

使用道具 举报

 楼主| otherbank 发表于 2011-9-8 09:31:21 | 显示全部楼层
64243354 发表于 2011-9-7 23:44
支持下

谢谢
回复

使用道具 举报

ring101219 发表于 2011-9-17 17:41:02 | 显示全部楼层
楼主,我按照你的方法改过后qq绑定登录不能用了哎,注册后又弹出绑定,怎么办呀?
回复

使用道具 举报

 楼主| otherbank 发表于 2011-9-17 23:09:55 | 显示全部楼层
ring101219 发表于 2011-9-17 17:41
楼主,我按照你的方法改过后qq绑定登录不能用了哎,注册后又弹出绑定,怎么办呀?

你再查一下你那个步骤有没有问题,我测过,如果在默认配置环境下,完全按上面的步骤是不过有报错的
回复

使用道具 举报

nxy105 发表于 2011-9-19 22:47:16 | 显示全部楼层
本帖最后由 nxy105 于 2011-9-19 22:48 编辑
otherbank 发表于 2011-9-17 23:09
你再查一下你那个步骤有没有问题,我测过,如果在默认配置环境下,完全按上面的步骤是不过有报错的

这样改你觉得如何?
https://discuz.dismall.com/forum.php?mod=viewthread&tid=2354054&page=1#pid20865198
回复

使用道具 举报

zwws 发表于 2011-10-13 14:08:49 | 显示全部楼层
本帖最后由 zwws 于 2011-10-13 14:09 编辑
  1. $_G['referer'] = 'http://'.$_SERVER['HTTP_HOST'].$_G['referer'];
复制代码
应该为
  1. $_G['referer'] = $_G['site_url'].$_G['referer'];
复制代码
否则当$_G['referer']为forum.php,会返回错误地址,如
http://www.abc.com/forum_dirforum.php

PS:使用QQ帐号登录时即会诱发此问题
回复

使用道具 举报

 楼主| otherbank 发表于 2011-10-13 14:15:46 | 显示全部楼层
zwws 发表于 2011-10-13 14:08
应该为
否则当$_G['referer']为forum.php,会返回错误地址,如
http://www.abc.com/forum_dirforum.php

你这样的话,二级目录登录会到http://127.0.0.1/bbs/bbs/forum.php这样类似的目录,是报错的
回复

使用道具 举报

 楼主| otherbank 发表于 2011-10-13 14:17:42 | 显示全部楼层
本帖最后由 otherbank 于 2011-10-13 14:18 编辑
zwws 发表于 2011-10-13 14:08
应该为
否则当$_G['referer']为forum.php,会返回错误地址,如
http://www.abc.com/forum_dirforum.php

$_G['siteurl']指的是php文件前的目录在本例中它是“http://127.0.0.1/bbs”;
$_G['referer']在本例中是“/bbs/forum.php”文件
回复

使用道具 举报

Gnagno 发表于 2011-10-14 22:49:53 | 显示全部楼层
支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 22:17 , Processed in 0.028324 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表