/data/common.inc.php 是织梦 DedeCMS 最核心的配置文件,存放数据库连接信息、表前缀、字符集等关键参数。一旦这个文件出现乱码或被 BOM 头污染,整个后台会白屏、登录后立刻掉线、或者 session 报 "headers already sent"。本文给出完整的修复流程。
一、common.inc.php 乱码的典型表现
1. 后台白屏
PHP 解析配置文件时遇到非法字符直接 Fatal error。
2. "headers already sent" 警告
文件开头有 BOM 字符(EF BB BF),PHP 把它当作输出,导致 session_start 失败。
3. 中文站点名变成 ????
$cfg_webname 等中文值显示为乱码。
4. 数据库连接失败
密码、库名里的字符被改成乱码,连不上 MySQL。
二、乱码的常见原因
1. 用记事本编辑后保存
Windows 记事本默认保存为 ANSI 或带 BOM 的 UTF-8,与织梦要求的"UTF-8 无 BOM"冲突。
2. FTP 上传时编码转换
某些 FTP 客户端"自动检测编码"功能把 UTF-8 当 GBK 重新编码。
3. 文件被注入恶意代码
挂马后植入的 eval/gzinflate 字符串常带特殊字符,破坏文件结构。
4. 服务器磁盘故障导致字节损坏
少见但确实存在,文件被改写为乱码。
三、修复步骤
1. 先备份当前损坏的文件
cp /www/wwwroot/域名/data/common.inc.php /www/wwwroot/域名/data/common.inc.php.bak
2. 用标准内容覆盖
织梦 V5.7 的标准 common.inc.php 模板如下,按自己站点信息填好:
<?php // 数据库连接配置 $cfg_dbtype='mysql'; $cfg_dbhost='localhost'; $cfg_dbname='dedecms'; $cfg_dbuser='root'; $cfg_dbpwd='yourpassword'; $cfg_dbprefix='dede_'; $cfg_db_charset='utf8'; $cfg_db_collation='utf8_general_ci'; // 站点基本参数(避免中文乱码,可不在此文件设置) $cfg_db_language='utf8'; ?>
注意:结尾的 ?> 后不要有任何空行或空格,否则会触发 headers already sent。
3. 用 Notepad++ 转换编码
用 Notepad++ 打开文件 → "编码"菜单 → 选择"转为 UTF-8 编码"(不是"转为 UTF-8-BOM")→ 保存。
4. 用 VSCode 操作
VSCode 右下角点击编码 → "通过编码保存" → 选择 "UTF-8"(无 BOM)。
5. 用 sed 命令去除 BOM(命令行)
sed -i '1s/^\xEF\xBB\xBF//' /www/wwwroot/域名/data/common.inc.php
6. 批量检查所有 PHP 文件的 BOM
cd /www/wwwroot/域名
find . -name "*.php" -exec grep -lH $'\xEF\xBB\xBF' {} \;
找出后逐个用 sed 去除。
四、验证修复
1. 用 file common.inc.php 看是否显示 "UTF-8 Unicode text" 而非 "UTF-8 Unicode (with BOM) text"。
2. 用 hexdump -C common.inc.php | head -1,开头应是 3c 3f 70 68 70(<?php),而不是 ef bb bf 3c。
3. 浏览器访问后台,能正常登录、session 不再掉线即修复成功。
五、注意事项
1. 任何 PHP 配置文件编辑都禁止用记事本,统一用 Notepad++/VSCode/Sublime。
2. FTP 客户端把"传输类型"设为"二进制(Binary)",避免文本模式自动转码。
3. 修复完成后立刻修改数据库密码(万一密码已泄露)。
4. 同步检查 config.cache.inc.php、inc_safe_config.php 是否也有同样问题。
common.inc.php 是织梦的"心脏",一旦乱码整站立刻趴下。修复的关键不在文件内容多复杂,而在"UTF-8 无 BOM + 无结尾空行"这两个细节。建议把一份标准的 common.inc.php 模板(不含密码)单独存档,每次搬家或排错时直接套用,再填入具体数据库信息,能彻底告别编码类故障。把"不用记事本编辑 PHP"作为团队基本规范,是从源头杜绝此类问题的根本动作。