common.inc.php乱码如何修复

/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 去除。

核心原则:common.inc.php 必须是 UTF-8 无 BOM、文件结尾无空行、所有 PHP 标签完整闭合。

四、验证修复

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.phpinc_safe_config.php 是否也有同样问题。

风险提醒:修复前一定备份原文件,哪怕已乱码,里面的密码也可能仍是可辨认的明文。

common.inc.php 是织梦的"心脏",一旦乱码整站立刻趴下。修复的关键不在文件内容多复杂,而在"UTF-8 无 BOM + 无结尾空行"这两个细节。建议把一份标准的 common.inc.php 模板(不含密码)单独存档,每次搬家或排错时直接套用,再填入具体数据库信息,能彻底告别编码类故障。把"不用记事本编辑 PHP"作为团队基本规范,是从源头杜绝此类问题的根本动作。