“动态”这个词在 DedeCMS 的语境下,通常有两种理解:

- 伪动态 (URL伪静态):这是最常见的需求,页面的 URL 地址看起来是
.html后缀,但实际上是服务器通过 Rewrite 规则动态生成的,内容实时从数据库读取,这有利于 SEO 和用户体验。 - 纯动态:页面的 URL 地址是
.php后缀,plus/list.php?cid=1,这种方式的优点是页面内容每次都是实时查询,绝对不会有缓存问题。
下面我将分别讲解如何实现这两种“动态”效果。
伪动态 (URL伪静态) - 推荐
这是目前的主流做法,兼顾了 SEO 和性能,通过配置,让 arclist 在列表页和文章页都使用 .html 格式的链接。
步骤 1:开启全局伪静态
你需要在 DedeCMS 的后台开启全站的伪静态功能。
- 登录 DedeCMS 后台。
- 进入 “系统” -> “系统基本参数” -> “核心设置”。
- 找到 “是否使用伪静态” 选项,将其设置为 “是”。
- 点击 “保存”。
步骤 2:配置服务器 Rewrite 规则
这是最关键的一步,你需要根据你的服务器环境(Apache, Nginx, IIS)来配置 Rewrite 规则,将 .html 的请求解析成 PHP 脚本。
Apache 服务器
在网站根目录下创建或修改 .htaccess 文件,并添加以下内容:
# 如果是dedecms5.7,请使用以下规则 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^index\.html$ /index.php [L] RewriteRule ^plus/list-([0-9]+)\.html$ /plus/list.php?tid=$1 [L] RewriteRule ^plus/list-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /plus/list.php?tid=$1&totalresult=$2&PageNo=$3 [L] RewriteRule ^plus/view-([0-9]+)-([0-9]+)\.html$ /plus/view.php?arcID=$1 [L] RewriteRule ^plus/view-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /plus/view.php?aid=$1&pageno=$2 [L] </IfModule>
Nginx 服务器
在 Nginx 的配置文件中(通常在 server 块内),添加以下规则:
location / {
if (!-e $request_filename) {
rewrite "^/index\.html$" /index.php last;
rewrite "^/plus/list-([0-9]+)\.html$" /plus/list.php?tid=$1 last;
rewrite "^/plus/list-([0-9]+)-([0-9]+)-([0-9]+)\.html$" /plus/list.php?tid=$1&totalresult=$2&PageNo=$3 last;
rewrite "^/plus/view-([0-9]+)-([0-9]+)\.html$" /plus/view.php?arcID=$1 last;
rewrite "^/plus/view-([0-9]+)-([0-9]+)-([0-9]+)\.html$" /plus/view.php?aid=$1&pageno=$2 last;
}
}
IIS 服务器
需要安装 URL Rewrite 模块,然后在网站根目录下创建 web.config 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="reindex" stopProcessing="true">
<match url="^index\.html$" />
<action type="Rewrite" url="index.php" />
</rule>
<rule name="relist" stopProcessing="true">
<match url="^plus/list-([0-9]+)\.html$" />
<action type="Rewrite" url="plus/list.php?tid={R:1}" />
</rule>
<rule name="relist2" stopProcessing="true">
<match url="^plus/list-([0-9]+)-([0-9]+)-([0-9]+)\.html$" />
<action type="Rewrite" url="plus/list.php?tid={R:1}&totalresult={R:2}&PageNo={R:3}" />
</rule>
<rule name="review" stopProcessing="true">
<match url="^plus/view-([0-9]+)-([0-9]+)\.html$" />
<action type="Rewrite" url="plus/view.php?arcID={R:1}" />
</rule>
<rule name="review2" stopProcessing="true">
<match url="^plus/view-([0-9]+)-([0-9]+)-([0-9]+)\.html$" />
<action type="Rewrite" url="plus/view.php?aid={R:1}&pageno={R:2}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
配置完成后,重启你的 Web 服务器。
步骤 3:更新文档HTML
为了确保所有已生成的文章链接都变成新的伪静态格式,你需要执行一次更新操作。
- 进入 “主页” -> “开始” -> “文档HTML设置”。
- 在 “文档HTML设置” 页面,勾选 “生成HTML” 选项卡下的 “所有栏目” 和 “所有文档”。
- 点击 “开始执行”,这个过程可能会比较耗时,特别是对于内容多的网站。
完成以上三步后,你的 arclist 标签输出的文章链接就会是 .../view-123-1.html 这样的伪静态格式了。
纯动态 (直接使用PHP链接)
如果你不关心 URL 是否有 .html 后缀,只是希望内容能实时更新,不依赖缓存,那么可以直接使用纯动态链接。
如何实现?
默认情况下,DedeCMS 的 arclist 标签在列表页生成的文章链接就是纯动态的。
<a href="{field:arcurl/}">
在列表页模板(如 list_article.htm)中,这个标签会解析为:
plus/view.php?arcid=123
什么时候会出问题?
当你使用了 “仅动态浏览” 功能时,系统会强制所有链接都变成动态的,但如果你发现 arclist 在首页或频道页生成的链接仍然是静态的(/html/2025/12/01/123.html),那是因为这些页面本身是静态生成的。
强制 arclist 在所有页面都生成动态链接
如果你想在首页等静态页面也调用动态链接,可以在 arclist 标签中使用 function 或 phpurl 等方式手动构造。
方法示例:
在首页模板中,使用如下 arclist 调用,可以强制生成动态链接:
{dede:arclist typeid='1' row='10'}
<li>
<a href="[field:phpurl/]/view.php?aid=[field:id/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
代码解释:
[field:phpurl/]:这个变量会输出 DedeCMS 的phpurl设置值,默认是/plus。view.php?aid=[field:id/]:这是文章详情页的动态链接参数。
这样,无论你在哪个模板里使用这个 arclist,生成的链接都会是 plus/view.php?aid=123 这样的纯动态形式。
总结与对比
| 特性 | 伪动态 | 纯动态 |
|---|---|---|
| URL 格式 | .../view-123-1.html |
.../plus/view.php?aid=123 |
| SEO 优化 | 非常好,符合搜索引擎对静态页面的偏好 | 一般,部分搜索引擎对动态 URL 收录和排名有轻微影响 |
| 用户体验 | 好,URL 清晰美观 | 一般,URL 参数较多,显得不够“正式” |
| 服务器负载 | 略高于纯静态,但低于纯动态 | 较高,每次访问都需要 PHP 解释器执行和数据库查询 |
| 适用场景 | 绝大多数网站的首选,兼顾 SEO、性能和体验 | 内容极不固定、需要实时性、且不介意 URL 格式的后台管理系统或工具页面 |
给你的建议:
- 对于 99% 的网站,请选择 伪动态 方案,这是 DedeCMS 的标准玩法,也是最佳实践。
- 只有在你的网站内容 秒级更新,且你 完全不在乎 SEO 时,才考虑使用纯动态链接。
希望这个详细的解释能帮助你完全理解 DedeCMS arclist 的动态化问题!
