- 修改 DedeCMS 程序文件:让 DedeCMS 生成符合我们期望的 TAG 链接格式。
- 配置 Nginx 服务器:将带有特定格式的链接地址,真实地映射到对应的 PHP 脚本上。
第一步:修改 DedeCMS 程序文件 (核心步骤)
这一步的目的是将类似 tags.php?/标签名/ 这样的动态链接,修改为 tags/标签名.html 这样的伪静态链接。

我们需要修改两个关键文件:
修改 taglib_tag.php 文件
这个文件是 DedeCMS 的标签库文件,用于解析和生成 [field:link/] 这样的标签,我们需要修改它,让它在生成 TAG 链接时使用新的伪静态格式。
文件路径:/include/taglib/taglib_tag.php
操作步骤:

- 打开
taglib_tag.php文件。 - 找到
function GetTags($typeid = 0)函数。 - 在函数内找到
$revalue = '';这一行。 - 在
foreach($dsql->GetArray('me') as $row)循环内部,找到生成链接的代码行,它通常是这样的:$revalue .= ($revalue == '' ? '' ',').'<a href="'.$cfg_cmsurl."/tags.php?/".$row['tag']."/\" class=\"tag\">".$row['tag'].'</a>';
- 将其修改为:
// 将动态链接 tags.php?/标签名/ 修改为伪静态链接 /tags/标签名.html $revalue .= ($revalue == '' ? '' ',').'<a href="'.$cfg_cmsurl."/tags/".$row['tag'].".html\" class=\"tag\">".$row['tag'].'</a>';
- 注意:这里我们使用了
$cfg_cmsurl变量,它会自动调用你后台设置的“网站根目录”,如果你的网站根目录是 ,那么最终生成的链接就是/tags/标签名.html,如果你的网站是放在子目录,/dedecms/,$cfg_cmsurl/dedecms/,最终链接会是/dedecms/tags/标签名.html。
- 注意:这里我们使用了
修改 arc.taglist.class.php 文件
这个文件是 TAG 列表页的核心类文件,用于处理 TAG 列表页的显示和分页链接,我们需要修改它,让列表页本身的链接和分页链接都变成伪静态格式。
文件路径:/include/arc.taglist.class.php
操作步骤:
-
打开
arc.taglist.class.php文件。
(图片来源网络,侵删) -
修改列表页链接:找到
function GetListUrl($gtype)函数,在里面找到return $this->MakeFirstTag($this->TagInfos['tagname']);这一行,它返回的是当前 TAG 列表页的 URL,通常它会返回tags.php?/标签名/。- 修改为:
// 将列表页链接修改为伪静态格式 return $this->MakeFirstTag($this->TagInfos['tagname']) . '.html';
- 注意:这行代码通常在一个
switch语句的case '1':分支里,请确保修改正确。
- 修改为:
-
修改分页链接:找到
function GetPageListDM($list_len,$listitem="",$isdatinfo="true")函数,这个函数生成分页代码,我们需要找到生成分页链接的部分,它通常是plus目录下的list.php。-
在函数内搜索
$plist = '';或类似代码,找到生成分页链接的循环。 -
找到类似
return $this->GetCurUrl();的代码,这通常是生成分页链接的核心。 -
将其修改为:
// 修改分页链接,将动态链接改为伪静态 $tagname = urlencode($this->TagInfos['tagname']); $pagenow = $this->PageNo; $totalpage = $this->TotalPage; // 生成首页、上一页等链接 $prepage = $this->GetPrePage(); $nextpage = $this->GetNextPage(); // 这里直接构建伪静态分页链接 $listUrl = $this->NameFirst . $tagname . '.html'; // ... 后续代码需要重构以适应伪静态分页 ... // 以下是一个更完整的修改示例,请根据你的代码结构调整 $plist = ''; if($totalpage > 1){ if($this->PageNo != 1){ $plist .= "<a href='".$listUrl."'>首页</a> "; $plist .= "<a href='".$prepage."'>上一页</a> "; } $plist .= "<span class=\"pageinfo\">共".$totalpage."页/".$this->TotalResult."条</span> "; if($this->PageNo!=$totalpage){ $plist .= "<a href='".$nextpage."'>下一页</a> "; $plist .= "<a href='".$listUrl . "-" . $totalpage . ".html'>末页</a> "; } } return $plist; -
更简单且兼容性更好的修改方法:在
GetPageListDM函数中,找到生成$plist字符串的循环,将类似plus/list.php?tid=...的链接,替换为tags/标签名-页码.html的格式,将return $this->GetCurUrl();这样的行替换为:// 一个更通用的修改方法,将动态分页URL替换为伪静态 $tagname = urlencode($this->TagInfos['tagname']); $plist = str_replace("plus/list.php?tid=".$this->TypeID, "tags/".$tagname."-".$this->PageNo.".html", $plist); return $plist;注意:这种方法可能需要根据你的 DedeCMS 版本和具体代码进行调整。
-
第二步:配置 Nginx 服务器规则
修改完程序后,我们需要告诉 Nginx 如何处理这些新的 .html 链接,Nginx 需要将请求重写回 tags.php 脚本。
操作步骤:
- 登录你的 Nginx 服务器。
- 找到你的网站配置文件,通常位于
/etc/nginx/sites-available/目录下,或者/usr/local/nginx/conf/vhost/目录下(取决于你的安装方式)。 - 打开对应的网站配置文件(
your_domain.com.conf)。 - 在
server块中,添加或修改location块。
推荐(更简洁、高效)
这个方案将所有对 /tags/ 目录下的请求都交给 tags.php 处理。
server {
# ... 其他配置 ...
# 将 /tags/目录下的所有请求都交给 tags.php 处理
# /tags/你好.html -> tags.php?/你好/
location /tags/ {
# rewrite ^/tags/(.*)\.html$ /tags.php?/$1/ last;
# 或者使用更健壮的 rewrite 规则
rewrite ^/tags/([^\.]+)\.html$ /tags.php?/$1/ last;
}
# ... 其他配置 ...
}
规则解释:
location /tags/ { ... }:匹配所有以/tags/开头的请求。rewrite ^/tags/([^\.]+)\.html$ /tags.php?/$1/ last;:这是重写规则。^:匹配字符串的开始。/tags/:匹配字面量/tags/。([^\.]+):这是一个捕获组,匹配一个或多个除了 以外的字符(即标签名),这个标签名会被存储在$1变量中。\.html$:匹配字面量.html,并到达字符串的结尾。/tags.php?/$1/:将匹配到的 URL 重写为/tags.php?/标签名/的形式。last:停止处理当前的rewrite指令,并使用重写后的 URL 在server块中重新开始搜索匹配的location,它会将请求交给location ~ \.php$ { ... }块去处理。
处理分页链接
如果你按照第一步修改了分页链接为 tags/标签名-页码.html,Nginx 规则需要稍作调整以支持这种格式。
server {
# ... 其他配置 ...
# 方案一:处理不带分页的链接
location ~ ^/tags/([^\.]+)\.html$ {
rewrite ^/tags/([^\.]+)\.html$ /tags.php?/$1/ last;
}
# 方案二:处理带分页的链接 ( tags/你好-2.html)
location ~ ^/tags/([^\.]+)-(\d+)\.html$ {
# 将 /tags/你好-2.html 重写为 /tags.php?/你好/&page=2
rewrite ^/tags/([^\.]+)-(\d+)\.html$ /tags.php?/$1/&page=$2 last;
}
# ... 其他配置 ...
}
这个方案使用了更精确的正则表达式来匹配两种不同的链接格式。
第三步:最终检查与重启
-
检查配置:在修改 Nginx 配置文件后,务必先检查配置语法是否正确,在终端运行:
nginx -t
如果看到
syntax is ok和test is successful的提示,说明配置没有语法错误。 -
重启 Nginx:配置无误后,平滑重启 Nginx 以使新配置生效:
# 平滑重启(推荐) nginx -s reload # 或者直接重启服务 # systemctl restart nginx # /etc/init.d/nginx restart
-
清除缓存:
- 登录 DedeCMS 后台,进入“系统” -> “SQL命令行工具”,执行
optimize table dede_tagindex; optimize table dede_taglist;来优化数据库表。 - 清除 DedeCMS 的“更新HTML缓存”。
- 清除浏览器缓存,或者使用无痕模式访问网站。
- 登录 DedeCMS 后台,进入“系统” -> “SQL命令行工具”,执行
| 步骤 | 操作 | 目的 |
|---|---|---|
| 修改程序 | 修改 taglib_tag.php 和 arc.taglist.class.php |
让 DedeCMS 生成 tags/标签名.html 格式的链接 |
| 配置Nginx | 在 server 块中添加 rewrite 规则 |
将 tags/标签名.html 的请求转发给 tags.php 处理 |
| 重启服务 | 运行 nginx -s reload |
使 Nginx 新配置生效 |
| 清除缓存 | 清除 DedeCMS 和浏览器缓存 | 确保能看到最新的效果 |
完成以上步骤后,你的 DedeCMS TAG 标签就应该成功实现伪静态了,你可以通过在文章中添加 TAG,然后在前台点击标签链接,观察浏览器地址栏的变化,并确保页面能正常显示,如果页面显示异常,请检查浏览器控制台的错误信息和 Nginx 的错误日志(/var/log/nginx/error.log),通常能快速定位问题。
