核心概念:织梦URL的构成
在修改之前,我们先要理解织梦默认的URL结构是什么,织梦的文章URL通常由以下几个部分决定:

- 文章ID (
arcID):文章在数据库中的唯一ID。 - 栏目目录 (
typedir):文章所属栏目的目录,在“栏目管理”中设置。 - 文章命名规则 (
namerule):在“系统” -> “核心设置”中配置的全站文章命名规则。 - 文件后缀 (
fileext):在“系统” -> “核心设置”中配置的文件后缀,如.html。
默认的URL可能是这样的:
{栏目目录}/{文章ID}.html
或者
{栏目目录}/{年月日}/{文章ID}.html
我们的目标就是通过修改这个规则,让它变成我们想要的格式,
{栏目目录}/{文章拼音或标题}.html
{栏目目录}/{文章ID}/{文章拼音或标题}.html
{栏目目录}/{文章ID}.htm (只改后缀)
修改核心文件(最彻底,但不推荐新手)
这是最直接的方法,通过修改织梦的核心代码文件,让所有调用都遵循新的URL规则。
适用场景:需要全站统一使用一种全新的、非ID的URL结构,并且不打算在后台手动修改每个文章的“文件名”字段。

操作步骤:
-
找到核心文件: 文件路径为:
/include/helpers/extend.helper.php(注意:在织梦V5.7及更高版本中,此文件路径可能为/include/helpers/channelunit.helper.php,请根据你的版本确认,这里以extend.helper.php为例。) -
定位并修改函数: 在该文件中找到
GetArcUrl函数,这个函数就是专门用来生成文章URL的。 -
修改URL生成逻辑: 打开
GetArcUrl函数,你会看到类似这样的代码:
(图片来源网络,侵删)function GetArcUrl($arcid, $typeid, $timetag, $title, $ismake=1, $filename='', $arcdir='') { // ... 一些判断逻辑 ... if($cfg_rewrite == 'Y') { // ... 伪静态规则下的URL生成 ... } else { // 这里是默认的URL生成逻辑,我们要修改的主要是这个部分 $articleUrl = $GLOBALS['cfg_phpurl']."/view.php?aid=$arcid"; } // ... 返回URL ... }你需要修改的是
else部分的逻辑,假设你想把URL改成{栏目目录}/{文章拼音}.html,你需要:- 获取文章的拼音(织梦默认没有这个字段,你需要先给
dede_archives表增加一个pinyin字段,并在发布文章时自动填充)。 - 获取栏目目录。
- 拼接成新的URL。
修改后的示例代码(逻辑示意):
function GetArcUrl($arcid, $typeid, $timetag, $title, $ismake=1, $filename='', $arcdir='') { // ... 前面的判断逻辑 ... if($cfg_rewrite == 'Y') { // 伪静态下的新规则 $row = $dsql->GetOne("SELECT * FROM `dede_archives` WHERE id='$arcid'"); $pinyin = empty($row['pinyin']) ? GetPinyin($row['title']) : $row['pinyin']; // 假设你有一个GetPinyin函数 $typeinfo = GetOneType($typeid); $articleUrl = $typeinfo['typedir'].'//'.$pinyin.'.html'; } else { // 动态下的新规则 $articleUrl = $GLOBALS['cfg_phpurl']."/view.php?aid=$arcid"; } return $articleUrl; } - 获取文章的拼音(织梦默认没有这个字段,你需要先给
⚠️ 重要警告:
- 风险高:修改核心文件后,每次织梦升级时,你都需要手动重新修改,非常麻烦。
- 不灵活:这种修改是全局性的,无法为不同栏目设置不同的URL规则。
- 依赖自定义字段:通常需要你预先在数据库中添加新字段(如拼音、缩写等)并填充数据。
除非你有特殊需求且对织梦非常熟悉,否则强烈不推荐使用此方法。
修改模板标签(最推荐,最灵活)
这是最常用、最安全、最灵活的方法,它不修改织梦核心,而是通过在模板文件中使用更强大的标签或自定义函数来实现。
场景1:只修改URL后缀(如 .html 改为 .htm)
这是最简单的修改,只需要修改一个全局配置。
- 登录织梦后台。
- 进入 系统 -> 核心设置。
- 找到 “文件保存目录” 或 “栏目目录默认名” 相关设置下方的 “文件命名规则”。
- 找到 “文章命名规则”,将其中的
{cmspath}改为{typedir}(如果还不是的话),确保它包含{aid}。 - 找到 “文件默认后缀”,将其从
html修改为你想要的htm或shtml等。 - 修改后,重新生成所有HTML。
效果:
修改前:/news/1.html
修改后:/news/1.htm
场景2:使用自定义字段和函数生成友好URL(如拼音、缩写)
这种方法的核心是利用织梦的 “自由列表” 或 “自定义函数” 来实现。
操作步骤(以自定义函数为例):
-
准备数据:
- 给
dede_archives表增加一个新字段,shorttitle(短标题) 或pinyin(拼音),你可以使用phpMyAdmin等工具直接操作数据库。 - 在发布或编辑文章时,手动填写这个字段的值,文章标题是“织梦CMS使用教程”,你可以填写
zhimengcms。
- 给
-
编写自定义函数:
- 在
/include/extend.func.php文件中(如果不存在则创建一个),添加一个函数来获取这个自定义字段的值。// 函数名可以自定义,getShortTitle if (!function_exists('getShortTitle')) { function getShortTitle($aid) { global $dsql; $row = $dsql->GetOne("SELECT shorttitle FROM dede_archives WHERE id = '$aid'"); // 如果shorttitle为空,则返回默认的aid return empty($row['shorttitle']) ? $aid : $row['shorttitle']; } }
- 在
-
在模板文件中使用:
- 打开你想要修改URL的列表模板文件(通常是
list_article.htm或index.htm)。 - 找到调用文章URL的标签,默认是
[field:arcurl/]。 - 用我们的自定义函数替换掉
arcurl的值,并结合织梦的URL规则。
修改前:
<a href="[field:arcurl/]">[field:title/]</a>
修改后(假设栏目目录是
/news,文件后缀是.html):<a href="/news/[field:id function='getShortTitle(@me)']/[field:id].html">[field:title/]</a>
或者,如果你想保持和原URL结构类似,只是替换文件名部分:
<a href="[field:typedir/]/[field:id function='getShortTitle(@me)'].html">[field:title/]</a>
说明:
[field:id function='getShortTitle(@me)']:这里的@me是当前字段的值,即field:id的值,我们将文章ID作为参数传递给getShortTitle函数,函数会返回我们数据库里存的shorttitle值。- 这种方法非常灵活,你可以为不同栏目使用不同的模板,从而实现不同的URL结构。
- 打开你想要修改URL的列表模板文件(通常是
这是最推荐的方法,因为它安全、灵活,且不破坏系统升级。
使用“自由列表”标签(适用于特定列表页)
自由列表是织梦一个非常强大的功能,它允许你用SQL语句直接查询数据并自定义输出格式,自然也包括自定义URL。
适用场景:在某个特定的列表页(比如首页的一个推荐文章模块)需要使用特殊的URL规则,而其他页面保持不变。
操作步骤:
- 在后台,创建一个“自由列表”。
- 在“SQL语句”部分,编写你的查询语句,确保包含文章ID、标题、栏目ID等信息。
- 在“模板”部分,编写你的HTML代码。
- 在模板中,你可以自由组合URL。
示例:
假设你想在首页调用一个“热门文章”列表,URL格式为 /hot/{文章ID}.html。
- 创建自由列表,SQL语句可以是:
SELECT a.id, a.title, a.typeid, t.typedir FROM dede_archives a LEFT JOIN dede_arctype t ON a.typeid = t.id WHERE a.ismake = 1 ORDER BY a.click DESC LIMIT 10
- 在自由列表的模板中,你可以这样写:
{dede:freelist} <li> <a href="/hot/[field:id].html">[field:title/]</a> </li> {/dede:freelist}注意,这里直接使用了硬编码的路径
/hot/,你需要确保服务器上已经配置了相应的伪静态规则,将/hot/([0-9]+).html指向view.php?aid=$1。
自由列表适合用于制作特殊的数据模块,不适合用来替换整个网站的文章列表。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 修改核心文件 | 彻底,一劳永逸 | 风险极高,升级麻烦,不灵活 | ★☆☆☆☆ |
| 修改模板标签 | 安全,灵活,不破坏系统,可定制性强 | 需要一定的PHP和织梦知识,前期准备工作稍多 | ★★★★★ |
| 使用自由列表 | 功能强大,适合特定模块 | 仅适用于特定页面,需要配置伪静态 | ★★★☆☆ |
给你的最终建议:
对于绝大多数用户,请优先选择“方法二:修改模板标签”,这是最专业、最可持续的解决方案,虽然它比直接改核心文件多几个步骤,但能让你在未来的网站维护和升级中省去无数麻烦。
如果你只是想简单地把后缀从 .html 改成 .htm,那么使用“方法二”中的场景1,直接修改后台核心设置即可,这是最简单的情况。
