织梦url地址出现中文乱码
织梦站点在栏目页、文章页 URL 中出现 %E7%BB%87 这类百分号编码,或直接显示成 ??? 问号乱码,既影响美观也拖累 SEO 收录。根因通常在文件编码、栏目命名、伪静态规则三处,下面逐项拆解。
一、乱码的三种表现
- URL 中栏目名为百分号编码(如
/news/%E5%85%AC%E5%91%8A.html)。 - URL 中显示问号或方框(如
/news/???.html)。 - 伪静态后栏目拼音正常但 Tag 中文参数乱码。
二、文件编码不统一
1. 程序文件编码错误
织梦 UTF-8 版本的 PHP 文件若被编辑器以 GBK 保存,输出到浏览器时会与页面声明的 UTF-8 不匹配,URL 中的中文栏目名就会乱码。用 Notepad++ 或 VSCode 打开 /include/common.inc.php,确认右下角编码为 UTF-8 无 BOM。
// 批量转换编码(谨慎操作,先备份)
// Notepad++: 编码 → 转为 UTF-8 无 BOM → 保存
2. 模板文件编码
模板 .htm 文件同样需要 UTF-8 无 BOM。BOM 头会导致页面顶部出现空白行,部分情况下还会干扰 URL 输出。
三、栏目命名规则设置
1. 文件保存目录使用中文
栏目编辑页“文件保存目录”若直接填中文(如“公告”),生成静态后 URL 即为 /公告/,浏览器会自动转码为百分号。正确做法是使用拼音或英文。
2. 启用拼音目录
在“系统 → 核心设置”中开启“是否使用拼音作为栏目保存目录”,新建栏目时填写中文栏目名会自动转为拼音:
栏目名:公司公告
生成目录:/gonggongonggao/
四、数据库编码不一致
数据库为 latin1 或 gbk,而程序为 utf8 时,从库中读取的栏目名到 URL 会乱码。通过 phpMyAdmin 检查 dede_arctype 表的整理规则,应为 utf8_general_ci 或 utf8mb4_general_ci。
ALTER TABLE `dede_arctype` CONVERT TO CHARACTER SET utf8mb4;
五、伪静态规则编码
1. Nginx 中文参数
伪静态规则中若直接匹配中文,Nginx 默认按字节处理会导致部分中文截断。建议规则中只匹配参数 ID,由程序内部转换为中文标题。
# 推荐用 ID 而非中文做路由
rewrite ^/news/([0-9]+)\.html$ /plus/view.php?aid=$1 last;
2. Tag 中文参数乱码
Tag 页 URL 含中文时,需在 /plus/tag.php 中对接收到的参数做编码转换:
$tag=mb_convert_encoding($_GET['tag'], 'UTF-8', 'UTF-8,GBK');
六、浏览器与服务器编码协商
确认页面 head 中声明了正确编码,并在 Nginx 配置中设置默认字符集:
charset utf-8;
同时 HTML head 中保留:
<meta charset="UTF-8">
七、按现象定位
- 百分号编码 → 栏目目录用了中文,改拼音。
- 问号乱码 → 文件或数据库编码错误。
- 仅 Tag 乱码 → tag.php 参数编码转换缺失。
- 迁移后突发乱码 → 数据库导入编码与原库不一致。
URL 规范化建议
干净的 URL 既是用户体验也是搜索引擎友好的基础。建议在建站之初就锁定“栏目用拼音、文章用 ID、Tag 用转码”的统一规则,避免后期返工。对已存在中文 URL 的老站,可先用 301 重定向将中文路径映射到拼音路径,再逐步替换内链,让站点在保持收录权重平稳过渡的同时,获得更清晰的 URL 结构。