今天迁移本地一个系统(DEDE CMS + Discuz)到服务器上,迁移后论坛无法登录了并且UCenter中显示DEDE以及Discuz两个应用的状态是”通信失败“。
经过对Discuz登录代码的仔细分析,在HTTP Fox插件的帮助下,最终发现,登录验证已经通过了,但是服务器却没有发送验证Cookie,从而表现出无法登录的情况。
Discuz中自定义的写Cookie函数是dsetcookie(...),构造如下的代码执行:
<?php
require_once './include/common.inc.php';
dsetcookie('user','redice');
?>
通过HTTP Fox发现,上述代码执行后并未成功设置Cookie。再构造如下代码:
<?php
require_once './include/common.inc.php';
setcookie('user','redice'); // 直接调用php内置的设置Cookie的函数(dsetcookie内部也是调用的该函数)
?>
通过HTTP Fox发现,上述代码执行后仍未成功设置Cookie。再构造如下代码:
<?php
setcookie('user','redice');
?>
再次代码执行后,看到已经成功设置了cookie。看了问题是出在include/common.inc.php文件中了。
经过对include/common.inc.php的仔细分析后,将焦点定位在了bbs/config.inc.php文件上了,因为只有这个文件在系统迁移后进行了修改(数据库连接参数)。
用Editplus查看config.inc.php的编码发现,编码方式竟然是”UTF-8 + BOM“! 将编码改为”UTF-8“后,问题解决了,Ucenter与Discuz的通信也正常了。
再修改DEDE的include/common.inc.php文件的编码方式为”UTF-8“,Ucenter与DEDE的通信也正常了。
原因分析:
服务器设置Cookie需要修改HTTP的报头,因此在设置Cookie之前(setcookie函数被调用之前)不能先输出HTTP的正文(Entity),HTTP的正文必须在任何修改报头的动作之后才能被输出。
即不能在setcookie之前输出任何数据,否则将会导致设置Cookie失败。UTF-8的BOM数据导致了setcookie函数调用失败,从而导致了论坛出现无法登录的情况。
BOM是怎么产生的?
迁移后我是直接用记事本修改的UTF-8文件,保存的时候记事本自动加上了BOM。因此以后编辑UTF-8的文件最好使用使用EditPlus或UtraEdit。
至于BOM导致Ucenter与DEDE以及Discuz通信失败的原因尚未找到真正的原因。等待大牛指点....
都是BOM惹的祸!
[日志分享]
[日志信息]
该日志于 2010-09-22 13:48 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “都是BOM惹的祸!” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!! (尊重他人劳动,你我共同努力)
呵呵,谢谢
VaTG790i.最好的<a href=http://www.kyfei.com>网站推广软件</a>,
非常好
....................
;ui;普i;uighur;ui;ui;个
在unix网络编程中看到了关于TCP/IP的一些内容,我感觉还是写的不够。正在下载中,一定
下载地址呢