当前位置: 主页 > 日志 > PHP >

都是BOM惹的祸!

今天迁移本地一个系统(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通信失败的原因尚未找到真正的原因。等待大牛指点....

[日志信息]

该日志于 2010-09-22 13:48 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “都是BOM惹的祸!” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部