织梦url地址出现中文乱码

织梦CMSURL乱码编码修复

织梦站点在栏目页、文章页 URL 中出现 %E7%BB%87 这类百分号编码,或直接显示成 ??? 问号乱码,既影响美观也拖累 SEO 收录。根因通常在文件编码、栏目命名、伪静态规则三处,下面逐项拆解。

一、乱码的三种表现

二、文件编码不统一

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">

七、按现象定位

批量修改文件编码前务必备份整站,错误的编码转换可能让所有中文变为乱码且难以恢复。

URL 规范化建议

干净的 URL 既是用户体验也是搜索引擎友好的基础。建议在建站之初就锁定“栏目用拼音、文章用 ID、Tag 用转码”的统一规则,避免后期返工。对已存在中文 URL 的老站,可先用 301 重定向将中文路径映射到拼音路径,再逐步替换内链,让站点在保持收录权重平稳过渡的同时,获得更清晰的 URL 结构。