前一篇文章中也提到了,我们正在用 Discuz! 搭建一个论坛,我们这个论坛完全是用作内部交流的,不希望没有账号的人(包括搜索引擎)看到论坛内的任何信息。在管理员设置里面找了半天,发现一个很奇怪也蛮有趣的现象:可以让“禁止IP”、“禁止访问”,甚至“版主”、“超级版主”等用户组不能访问论坛的任何页面(用户组基本设置中的“允许访问论坛”),但对于游客则没有这个选项。也许对于大多数开放的论坛无所谓,但对于我们这种特殊的论坛,就只能自己修改代码了。
这次的修改要简单的多,只要添加两句话就足够了,我们来看看是如何修改的:
文件:/include/common.func.php;
说明:这个文件中包含的代码几乎在访问论坛任何页面时都会被执行,它包含了很多对用户权限的控制,我们只要添加对游客的访问限制即可;
关注范围:L365~L378:
if(isset($allowvisit) && $allowvisit == 0 && !(CURSCRIPT == 'member' && ($action == 'groupexpiry' || $action == 'activate'))) {
showmessage('user_banned', NULL, 'HALTED');
} elseif(!(in_array(CURSCRIPT, array('logging', 'wap', 'seccode', 'ajax')) || $adminid == 1)) {
if($bbclosed) {
clearcookies();
$closedreason = $db->result_first("SELECT value FROM {$tablepre}settings WHERE variable='closedreason'");
showmessage($closedreason ? $closedreason : 'board_closed', NULL, 'NOPERM');
}
periodscheck('visitbanperiods');
369行开始的那段代码是对被禁止的用户组或账户进行屏蔽,以及处理论坛暂时关闭的情况,就在它前面加上对游客的限制即可。游客跟已经登录的用户的最大区别之一就是游客没有uid信息,我么就通过有没有uid来判断这个用户是不是游客。另外,虽然游客不能访问论坛的任何页面,但总要让他能够注册或者登录吧,所以要把相关的页面权限放开,除了371行中所列的几项外,还要放开seccode,除非你的论坛设置是注册和登录时都不需要输入验证码。
修改内容:
//论坛对游客关闭
if(!$discuz_uid && !(defined('CURSCRIPT') && in_array(CURSCRIPT, array('logging', 'wap', 'seccode','ajax','register')))) {
$closedreason = $db->result($db->query("SELECT value FROM {$tablepre}settings WHERE variable='closedreason'"), 0);
showmessage('您未被授权访问', NULL, 'NOPERM');
}
//论坛对游客关闭结束
这样修改之后,未登录状态下访问论坛会得到类似于“您无权进行当前操作,这可能因以下原因之一造成:对不起,您还没有登录,无法进行此操作。”的提示信息,并直接跳转到登录界面。
方法是个好方法,但经本人实验有个问题,不知能否解决?
如果加上这些代码,注册设为人工审核的况下,如果有人新注册,在审核通过之前,你没法进行任何操作,打开就是限制访问,如果我有已经注册的账户也没办法登录!