前一篇文章中也提到了,我们正在用 Discuz! 搭建一个论坛,我们这个论坛完全是用作内部交流的,不希望没有账号的人(包括搜索引擎)看到论坛内的任何信息。在管理员设置里面找了半天,发现一个很奇怪也蛮有趣的现象:可以让“禁止IP”、“禁止访问”,甚至“版主”、“超级版主”等用户组不能访问论坛的任何页面(用户组基本设置中的“允许访问论坛”),但对于游客则没有这个选项。也许对于大多数开放的论坛无所谓,但对于我们这种特殊的论坛,就只能自己修改代码了。
这次的修改要简单的多,只要添加两句话就足够了,我们来看看是如何修改的:
文件:/include/common.func.php;
说明:这个文件中包含的代码几乎在访问论坛任何页面时都会被执行,它包含了很多对用户权限的控制,我们只要添加对游客的访问限制即可;
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'); } //论坛对游客关闭结束 |
这样修改之后,未登录状态下访问论坛会得到类似于“您无权进行当前操作,这可能因以下原因之一造成:对不起,您还没有登录,无法进行此操作。”的提示信息,并直接跳转到登录界面。