核心问题:为什么图片路径会出错?
DedeCMS 的图片路径问题通常源于两种情况:

- 静态化生成:DedeCMS 生成的是 HTML 静态文件,当你在后台设置“使用绝对路径”时,生成的路径是
http://www.yourdomain.com/uploads/xxx.jpg;如果不设置,则可能是相对路径../uploads/xxx.jpg或/uploads/xxx.jpg。 - 后台与前台路径不一致:你可能在后台编辑文章时看到的图片路径是正确的,但前台调用时因为路径解析问题导致图片无法显示。
理解了这一点,我们来看具体的解决方案。
中的图片({dede:field.body/} 或 {dede:field.content/})
这是最常见的情况,文章内容是通过富文本编辑器(如ckeditor)编辑的,图片已经上传到服务器,并且路径被保存在数据库的 body 或 content 字段中。
问题:在文章列表页或首页调用 {dede:field.body/} 时,如果图片路径是相对路径,且当前页面层级较深,图片可能无法显示。
解决方案:

最佳实践:在后台开启“使用绝对路径”
这是最简单、最根本的解决方法,当你开启此选项后,DedeCMS 在生成文章静态页时,会自动将文章中的所有相对路径图片转换为完整的、带域名的绝对路径。
操作步骤:
- 登录 DedeCMS 后台。
- 进入【系统】-> 【系统基本参数】。
- 在左侧菜单选择【核心设置】。
- 找到 “是否使用绝对路径” 选项,将其设置为 “是”。
- 点击 “保存” 按钮。
原理:
开启后,DedeCMS 在生成文章时,会通过正则表达式替换文章内容中的相对路径(如 src="/uploads/..." 或 src="../uploads/...")为 src="http://www.yourdomain.com/uploads/...",这样,无论你的网站被部署在任何目录下,图片路径都是正确的。
调用文章缩略图({dede:field.litpic/})
缩略图是在发布文章时手动上传或自动裁剪生成的,其路径保存在数据库的 litpic 字段中。
问题:{dede:field.litpic/} 默认调用的是相对路径,可能导致图片不显示。
解决方案:
方法1:使用 @me 进行路径替换(推荐)
这是最灵活、最常用的方法,可以在模板中直接对路径进行处理。
{dede:field name='litpic' function='str_replace("@me","/uploads/", "http://www.yourdomain.com/uploads/")/'}
代码解析:
function='...':对标签的值执行一个 PHP 函数。str_replace():PHP 的字符串替换函数。"@me":这是 DedeCMS 标签函数中的一个特殊变量,代表标签本身当前的值,即{dede:field.litpic/}的原始值(如/uploads/2025/10/xx.jpg)。"/uploads/":要被替换掉的字符串。"http://www.yourdomain.com/uploads/":替换成的新字符串。
更简洁的写法(推荐):
如果缩略图路径都是以 /uploads/ 开头的,可以这样写:
{dede:field.litpic function='str_replace("@me", "http://www.yourdomain.com", "@me")/'}
这个写法会把路径中的域名部分补全。
方法2:在标签循环外统一处理
如果你在一个列表页中循环调用文章,并且希望所有缩略图都使用绝对路径,可以在循环外部定义一个变量,然后在循环内使用。
{dede:arclist typeid='1' titlelen='30'}
<li>
<!--
这里用 [field:litpic/] 获取图片路径,
然后在前面拼接上你的域名
-->
<img src="http://www.yourdomain.com/[field:litpic/]" alt="[field:title/]">
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
注意:这种方法硬编码了域名,不利于网站迁移,如果网站可能更换域名,方法1 更优。
调用自定义字段中的图片
如果你在模型中添加了一个自定义字段,类型为“图片”,那么调用的方式与缩略图类似。
假设你的自定义字段名为 myimg。
解决方案:
同样使用 function 函数进行路径替换。
{dede:field.myimg function='str_replace("@me", "http://www.yourdomain.com", "@me")/'}
或者在列表标签中:
{dede:arclist}
<img src="http://www.yourdomain.com/[field:myimg/]">
{/dede:arclist}
调用系统内置的图片(如栏目图标、广告图等)
这些图片路径通常也存储在数据库中,调用方式与自定义字段类似,只是标签名不同,调用栏目图标 {dede:field.typelink/} 中的图片也需要进行路径处理。
总结与最佳实践
| 场景 | 推荐解决方案 | |
|---|---|---|
| 图 | {dede:field.body/} |
后台核心设置 -> 开启“使用绝对路径”(一劳永逸) |
| 文章缩略图 | {dede:field.litpic/} |
使用 function='str_replace("@me", "http://www.yourdomain.com", "@me")/' |
| 自定义字段图 | {dede:field.自定义字段名/} |
使用 function='str_replace("@me", "http://www.yourdomain.com", "@me")/' |
| 列表页缩略图 | [field:litpic/] |
直接在标签前拼接域名:http://www.yourdomain.com/[field:litpic/] |
重要提醒:
- 开启“使用绝对路径”后,DedeCMS 会在生成静态页时处理路径,这意味着你修改设置后,需要重新生成相关的 HTML 页面(如文章页、列表页)才能生效。
- 域名问题:如果你的网站在本地开发(
localhost)和线上服务器使用不同的域名,使用str_replace硬编码域名会带来麻烦,DedeCMS 提供了一个全局变量{dede:global.cfg_basehost/}来获取网站在后台设置的“站点根网址”,这是更专业的做法。
更专业的写法(推荐用于缩略图):
{dede:field.litpic function='str_replace("@me", "{dede:global.cfg_basehost/}", "@me")/'}
这样无论你的域名是什么,都会自动替换成后台设置的域名,网站迁移时也无需修改模板。
