但如果你希望直接显示真实的文件地址(http://www.yoursite.com/uploads/soft/abc.zip),而不是 http://www.yoursite.com/plus/download.php?open=1&cid=123&aid=456,你需要修改核心文件。

修改核心文件会使你的网站在升级后需要重新修改此设置,并且会失去下载次数统计功能,请根据你的实际需求决定是否操作。
修改核心文件(直接显示真实地址)
这是最直接的方法,会永久性地改变下载地址的生成逻辑。
步骤 1:定位并修改文件
你需要修改织梦的核心类文件 arc.archives.class.php,它位于 /include/ 目录下。
-
使用FTP或文件管理器,登录你的网站服务器。
(图片来源网络,侵删) -
打开文件:
/include/arc.archives.class.php -
找到关键代码:在文件中搜索
this->MakeOneLink()函数,这个函数负责生成文章内容中的链接,找到类似下面这样的代码段:// 在 MakeOneLink 函数中找到处理下载地址的部分 if($this->dtp->CTags[$i]->GetAtt('type') == 'dl') { $link = $GLOBALS['cfg_phpurl']."/download.php?open=1&cid=".$this->ChannelUnit->ChannelInfos['nid']."&id=".$aid; // ... 其他代码 ... } -
替换代码:将上述代码块修改为直接获取附件地址。
修改前(原始代码片段):
(图片来源网络,侵删)// ... 其他代码 ... if($this->dtp->CTMs[$i]->GetAtt('type') == 'dl') { $link = $GLOBALS['cfg_phpurl']."/download.php?open=1&cid=".$this->ChannelUnit->ChannelInfos['nid']."&id=".$aid; $this->dtp->CTMs[$i]->SetValue($link); } // ... 其他代码 ...注意:不同版本的织梦,变量名可能是
$this->dtp->CTags或$this->dtp->CTMs,请根据你文件中的实际情况调整。修改后(直接显示真实地址):
// ... 其他代码 ... if($this->dtp->CTMs[$i]->GetAtt('type') == 'dl') { // 获取附件的真实地址 $row = $this->dsql->GetOne("SELECT url FROM `#@__uploads` WHERE aid = '{$aid}'"); if(is_array($row)) { // 判断是否为绝对路径,如果不是,则拼接网站根目录 if (strpos($row['url'], '://') === false) { $link = $GLOBALS['cfg_basehost'] . $row['url']; } else { $link = $row['url']; } $this->dtp->CTMs[$i]->SetValue($link); } } // ... 其他代码 ...
步骤 2:清理缓存
修改完成后,必须清理织梦的缓存,否则修改不会生效。
- 登录你的织梦后台。
- 进入 “系统” -> “一键更新网站”。
- 在右侧的选项中,勾选 “更新HTML” 和 “更新缓存”。
- 点击 “开始执行”。
完成以上步骤后,重新查看你的文章页面,下载地址就会直接显示为文件的绝对路径,而不是经过 download.php 处理的地址。
使用JS跳转(间接显示真实地址)
如果你既希望前台用户看到的是真实地址,又不想完全放弃下载统计功能,可以使用JavaScript进行一个“障眼法”。
这种方法的核心是:
- 前端HTML代码中,下载地址仍然是
download.php。 - 用户点击链接时,通过JS代码将地址替换为真实地址并跳转,同时向
download.php发送一个请求来记录下载次数。
步骤 1:修改模板文件
模板(通常是 article_article.htm)中,找到下载链接的代码,并为其添加一个特定的 class 和 data-url 属性。
修改前(默认模板代码):
<a href='{dede:field name='array' runphp='yes'} @me = (strpos(@me['type'], 'dl') === false ? '' : $GLOBALS['cfg_phpurl']."/download.php?open=1&cid=".@me['nid']."&id=".@me['aid']); {/dede:field}' title='下载'>点击下载</a>
修改后(添加JS钩子):
<a href='{dede:field name='array' runphp='yes'} @me = (strpos(@me['type'], 'dl') === false ? '' : $GLOBALS['cfg_phpurl']."/download.php?open=1&cid=".@me['nid']."&id=".@me['aid']); {/dede:field}'
class="real-download-link"
data-real-url="{dede:field name='phpurl'/}/download.php?open=1&cid={dede:field name='nid'/}&id={dede:field name='aid'/}"'下载'>点击下载</a>
这里我们添加了 class="real-download-link" 和 data-real-url 属性来方便JS识别。
步骤 2:添加JavaScript代码
在模板文件 <head> 标签内或页面底部,添加以下JavaScript代码:
<script>
document.addEventListener('DOMContentLoaded', function() {
var downloadLinks = document.querySelectorAll('.real-download-link');
downloadLinks.forEach(function(link) {
link.addEventListener('click', function(e) {
// 1. 发送一个1x1的透明图片请求到download.php,用于统计
var statsUrl = this.getAttribute('data-real-url');
var img = new Image();
img.src = statsUrl;
// 2. 获取真实的下载地址
// 假设你的真实地址存储在某个地方,或者通过其他方式获取
// 这里为了演示,我们假设真实地址是 download.php?open=2&id=xxx 这样的格式
// 你需要根据你的实际情况修改这里获取真实地址的逻辑
var realUrl = this.getAttribute('href'); // 或者从其他地方获取
// 3. 跳转到真实地址
window.location.href = realUrl;
// 阻止原始链接的默认行为
e.preventDefault();
});
});
});
</script>
注意:这个JS方法只是一个示例,它需要你能够从 download.php 的URL中解析出真实的文件地址,或者有其他方式获取到真实地址,实现起来比方法一复杂,而且如果用户禁用了JS,统计功能就会失效。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 修改核心文件 | 简单直接,一劳永逸,JS兼容性好。 | 失去下载统计功能,升级后需重改。 | 对下载次数统计没有要求,希望地址干净、直接的场景。 |
| JS跳转 | 保留了下载统计功能,前台地址看起来是真实的。 | 实现复杂,依赖JS,用户禁用JS后统计失效,可能被广告拦截。 | 既想显示真实地址,又想保留统计功能,且有能力处理JS逻辑的高级用户。 |
对于绝大多数用户来说,方法一 是最简单有效的解决方案,如果你真的需要统计功能,建议不要使用这些“取巧”的方法,而是考虑通过修改 download.php 文件,让它直接输出真实地址的同时,也记录下载日志,但这需要更深入的PHP开发能力。
