dede下载页如何显示直链而非php地址?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 DEDE建站 正文

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

dede 下载页显示直接地址不要php地址
(图片来源网络,侵删)

修改核心文件会使你的网站在升级后需要重新修改此设置,并且会失去下载次数统计功能,请根据你的实际需求决定是否操作。


修改核心文件(直接显示真实地址)

这是最直接的方法,会永久性地改变下载地址的生成逻辑。

步骤 1:定位并修改文件

你需要修改织梦的核心类文件 arc.archives.class.php,它位于 /include/ 目录下。

  1. 使用FTP或文件管理器,登录你的网站服务器。

    dede 下载页显示直接地址不要php地址
    (图片来源网络,侵删)
  2. 打开文件/include/arc.archives.class.php

  3. 找到关键代码:在文件中搜索 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;
        // ... 其他代码 ...
    }
  4. 替换代码:将上述代码块修改为直接获取附件地址。

    修改前(原始代码片段):

    dede 下载页显示直接地址不要php地址
    (图片来源网络,侵删)
    // ... 其他代码 ...
    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:清理缓存

修改完成后,必须清理织梦的缓存,否则修改不会生效。

  1. 登录你的织梦后台。
  2. 进入 “系统” -> “一键更新网站”
  3. 在右侧的选项中,勾选 “更新HTML”“更新缓存”
  4. 点击 “开始执行”

完成以上步骤后,重新查看你的文章页面,下载地址就会直接显示为文件的绝对路径,而不是经过 download.php 处理的地址。


使用JS跳转(间接显示真实地址)

如果你既希望前台用户看到的是真实地址,又不想完全放弃下载统计功能,可以使用JavaScript进行一个“障眼法”。

这种方法的核心是:

  1. 前端HTML代码中,下载地址仍然是 download.php
  2. 用户点击链接时,通过JS代码将地址替换为真实地址并跳转,同时向 download.php 发送一个请求来记录下载次数。

步骤 1:修改模板文件

模板(通常是 article_article.htm)中,找到下载链接的代码,并为其添加一个特定的 classdata-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开发能力。

-- 展开阅读全文 --
头像
C语言sleep(sleeptime)函数参数单位是什么?
« 上一篇 11-27
C语言pointer expected错误如何解决?
下一篇 » 11-27

相关文章

取消
微信二维码
支付宝二维码

目录[+]