如何跟踪文件下载
Posted
技术标签:
【中文标题】如何跟踪文件下载【英文标题】:How do I track file downloads 【发布时间】:2010-09-05 05:39:12 【问题描述】:我有一个在 Flash 播放器中播放 mp3 的网站。如果用户单击“播放”,Flash 播放器会自动下载 mp3 并开始播放。
是否有一种简单的方法可以跟踪特定歌曲剪辑(或任何二进制文件)的下载次数?
播放链接是指向实际的链接吗? mp3 文件或一些 javascript 代码 弹出一个播放器?
如果是后者,您可以轻松地添加您的 有自己的日志记录代码来跟踪 的点击次数。
如果是前者,你需要一些东西 可以跟踪网络服务器日志 本身并做出区分。我的 托管计划附带 Webalizer, 这很好。
这是一个 javascript 代码,因此可以回答这个问题。
但是,如果知道如何使用其他方法(无需切换主机)来跟踪下载,那就太好了。
【问题讨论】:
【参考方案1】:有趣的是我在两天前为我所有的音乐写了一个 php 媒体库。我有一个类似的问题。我正在为播放器使用http://musicplayer.sourceforge.net/。播放列表是通过 php 构建的。所有音乐请求都转到一个名为 xfer.php?file=WHATEVER
的脚本$filename = base64_url_decode($_REQUEST['file']);
header("Cache-Control: public");
header('Content-disposition: attachment; filename='.basename($filename));
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. filesize($filename));
// Put either file counting code here, either a db or static files
//
readfile($filename); //and spit the user the file
function base64_url_decode($input)
return base64_decode(strtr($input, '-_,', '+/='));
当您调用文件时,请使用以下内容:
function base64_url_encode($input)
return strtr(base64_encode($input), '+/=', '-_,');
http://us.php.net/manual/en/function.base64-encode.php
如果您使用需要 mp3 文件或其他文件的实际链接的 JavaScript 或 Flash 播放器(例如 JW 播放器),您可以附加文本“&type=.mp3”,以便最终链接变为: “www.example.com/xfer.php?file=34842ffjfjxfh&type=.mp3”。这样看起来它以 mp3 扩展名结尾而不影响文件链接。
【讨论】:
此脚本存在目录遍历漏洞!攻击者可以传入 xfer.php?file=../../../passwd 或其他任何他们想要的东西!小心!!! 如果文件太大并且您的流量很高,这将炸毁服务器的内存限制..这是我自己经历过的。 如何修复“目录遍历漏洞”? @anarchOi:最简单的方法是将 GET 参数 ($_REQUEST['file']
) 与已知良好文件名的白名单进行比较。例如,您存储文件的目录中所有文件的列表。确保您仅使用该目录来存储您希望可下载的文件...
@tmsimont,你找到降低内存消耗的方法了吗?【参考方案2】:
使用您的 httpd 日志文件。安装http://awstats.sourceforge.net/
【讨论】:
【参考方案3】:使用 bash:
grep mp3 /var/log/httpd/access_log | wc
【讨论】:
这个方法至少有2个缺陷:统计GET和HEAD请求,统计所有HTTP响应码。例如,可能有大量的 206 响应会导致您高估下载量。【参考方案4】:如果您的歌曲/二进制文件由 apache 提供,您可以轻松地 grep access_log 以找出下载次数。一个简单的 post-logrotate 脚本可以 grep 日志并在数据库中维护您的计数统计信息。 由于不在您的实时请求代码路径中,因此具有性能优势。离线执行统计信息等非关键性操作是将您的网站扩展到大量用户的好主意。
【讨论】:
【参考方案5】:您甚至可以设置一个 Apache .htaccess 指令,将 *.mp3 请求转换为 dubayou 正在使用的查询字符串。这可能是一种保留直接请求并且仍然能够将日志功能整合到响应中的优雅方式。
【讨论】:
【参考方案6】:播放链接是指向实际 mp3 文件的链接还是指向弹出播放器的一些 javascript 代码的链接?
如果是后者,您可以轻松地在其中添加自己的日志记录代码以跟踪对其的点击次数。
如果是前者,您将需要能够跟踪 Web 服务器日志本身并做出区分的东西。我的托管计划附带 webalizer,它可以很好地做到这一点。
【讨论】:
【参考方案7】:您的音乐库有数据库吗?如果在下载 mp3 时运行任何服务器代码,那么您可以在那里添加额外的代码以增加播放次数。您也可以让 javascript 发出第二个请求来增加播放次数,但这可能会导致人/机器人错误地增加次数。
我曾经在一家互联网广播网站工作,我们使用单独的表格来跟踪每首歌曲的播放时间。我们的流由运行 icecast 的 perl 脚本提供支持,因此每次新曲目开始播放时我们都会触发数据库请求。然后为了计算播放次数,我们将运行一个查询来计算一首歌曲的 id 在播放日志中出现的次数。
【讨论】:
【参考方案8】:我在使用 AWSStats / 阅读 Web 服务器日志等问题时遇到的问题是,大型下载通常会在日志中拆分为数据块。这使得协调下载的确切数量变得非常困难。
我建议使用 Google Analytics Event Tracking,因为每次点击下载链接都会注册一次。
【讨论】:
以上是关于如何跟踪文件下载的主要内容,如果未能解决你的问题,请参考以下文章