今天配置nginx反向代理的时候,发现无法加载验证码和安全问答问题
经过研究和谷歌搜索,发现原来discuz会在头部判断用户来源
所以解决办法是在nginx的虚拟主机配置中加入:
proxy_pass_header User-Agent;
proxy_set_header Host $host;
这样才能正确加载discuz中的验证码和安全问题
如果你也遇到了在nginx中无法加载discuz中的验证码,请使用上方同样的方法,我列举一个虚拟主机的配置例子:
server {
listen 80;
server_name bbs.aaa.com;
location / {
proxy_pass http://bbs.aaa.com:82;
proxy_redirect http://bbs.aaa.com:82/ /;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header User-Agent;
proxy_set_header Host $host;
}
access_log logs/bbs.aaa.com.access.log;
}
我们往往会使用nginx+apache来作为服务器环境,nginx使用80端口,Apache使用82端口,那么当我们安装discuz的时候,在加入了nginx映射到Apache端口后,往往discuz的链接地址栏上会出现端口号,如82
那么我们如何解决这个问题呢?
x2寻找文件source/class/class_core.php,寻找:$_G[‘siteport’]
将此行注释即可,或者强制在此文件的头部,加上:$_SERVER[‘HTTP_HOST’]=”www.域名.com”;
到此就可以解决discuz论坛地址栏带端口号的解决方法【nginx+apache反射】,但是x2.5是修改:
source/class/discuz/discuz_application.php
————————–
但是你会发现另外一个问题,就是验证码不能正确显示,解决办法如下:
直接在config/config_global.php下增加$_SERVER[‘HTTP_HOST’]=”www.域名.com”;即可解决所有问题
研究半天实在搞不定,原来还有此绝招~
往往我们需要在非discuz的内部页面中加入退出功能,比如链接:/bbs/member.php?mod=logging&action=logout&formhash=899b6270
最后一个参数fromhash是动态改变的,那么如何获取呢?请参考以下代码:
function myget_formhash($uid,$username,$authkey,$cookiepre,$cookiedomain,$cookiepath) {
/*
//$cookiepre\$cookiedomain\$cookiepath参数说明(bbs/config/config_global.php)
$authkey=$_config[‘security’][‘authkey’];
$cookiepre=$_config[‘cookie’][‘cookiepre’];
$cookiedomain=$_config[‘cookie’][‘cookiedomain’];
$cookiepath=$_config[‘cookie’][‘cookiepath’];
*/
$authkey=md5($authkey.$_COOKIE[$cookiepre.substr(md5($cookiepath.’|’.$cookiedomain),0,4).’_saltkey’]);
return substr(md5(substr($_SERVER[‘REQUEST_TIME’],0,-7).$username.$uid.$authkey),8,8);
}
require(‘bbs/config/config_global.php’);
$fromhash=myget_formhash(
$_SESSION[‘loginUser’][‘uid’],
$_SESSION[‘loginUser’][‘username’],
$_config[‘security’][‘authkey’],
$_config[‘cookie’][‘cookiepre’],
$_config[‘cookie’][‘cookiedomain’],
$_config[‘cookie’][‘cookiepath’]
);
这个时候$fromhash就是最终我们所要获取的值,最后的链接可以改为:
/bbs/member.php?mod=logging&action=logout&formhash=<?php echo $fromhash;?>
本文请结合:http://www.zhanghongliang.com/article/561
往往有的时候,我们需要根据discuz登录成功或者退出成功后加入自己的代码,今天稍微看了下,具体如下:
登录成功:
打开source/class/class_member.php
找到:if($result[‘status’] > 0) {
在此处加入:my_loginfunction(),自己定义下my_loginfunction()就可以了
退出成功:
打开source/class/class_member.php
找到function on_logout(){
再找到clearcookies(),加入:my_loginout(),自定义下my_loginout()就可以了。
注册成功:
注册成功的时候也是需要直接登录成功的,那么找到:
$uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G[‘clientip’]);
在if($uid <= 0) {后面加上:
else {
session_start();
$_SESSION[‘loginUser’]=array(‘uid’=>intval($uid),’username’=>$username);
}
如图:

discuz手动增加登录成功或退出成功的执行代码就结束并搞定了
discuz用户新消息表是哪个?在下面2个表中
pre_common_member_grouppm
pre_common_grouppm
其中pre_common_grouppm是消息内容
而pre_common_member_grouppm是具体的消息状态
近期评论