【问题标题】:How to track File Downloads on Server?如何跟踪服务器上的文件下载?
【发布时间】:2014-05-04 12:18:58
【问题描述】:

我在我的服务器上的一个目录中放置了一个 exe 文件,并在网络上的数百个站点(不是我的站点)上共享了该文件的链接。我在每个链接的末尾附加了不同的 ID。现在我正在下载服务器上的文件。我想跟踪单击链接的站点(sits/s 可以是网络上具有下载链接和 id 的任何站点)以及与下载相关的其他一些统计信息。

【问题讨论】:

    标签: php file download analytics tracking


    【解决方案1】:

    实际上,您可以简单地通过一些重写来反转 DKasipovic 的答案。例如:

    RewriteEngine on
    RewriteRule ^(.*).(exe|zip)$ /download.php?file=$1.$2 [R,L]
    

    然后在download.php中:

    $filename = filter_input(INPUT_GET, 'file', FILTER_SANITIZE_SPECIAL_CHARS);
    $path     = $_SERVER['DOCUMENT_ROOT']."/".filename;
    $referer  = $_SERVER['HTTP_REFERER'];
    if ($fd = fopen ($fullPath, "r")) {
    
       //assume you are tracking via Google Analytics - add UA and filename
    
       $data = array(
        'v' => 1,
        'tid' =>'UA-XXXXXXXX-X',
        'cid' => gen_uuid(), 
        'dh' => 'example.com',
        't' => 'event', 
        'ec' => 'Download', 
        'ea' => "$filename", 
        'el' => "$referer",
        'ev' => "",
        'ni'=>1
        );
    
        $url = 'http://www.google-analytics.com/collect'; 
        $content = http_build_query($data);
        $content = utf8_encode($content); 
        $user_agent = 'OFFLINE TRACK'; 
    
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_USERAGENT, $user_agent);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-type: application/x-www-form-urlencoded'));
        curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
        curl_setopt($ch,CURLOPT_POST, TRUE);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $content);
        curl_exec($ch);
        curl_close($ch);
    
        // now give them their file
        $fsize = filesize($path);
        $path_parts = pathinfo($path);
        header("Content-type: application/octet-stream");
        header("Content-Disposition: filename=".$path_parts["basename"]."");
        header("Content-length: $fsize");
        header("Cache-control: private");
        while(!feof($fd)) {
            $buffer = fread($fd, 2048);
            echo $buffer;
        }
    }
    fclose ($fd);
    exit;
    
    function gen_uuid() {
      return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
      mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
      mt_rand( 0, 0xffff ),
      mt_rand( 0, 0x0fff ) | 0x4000,
      mt_rand( 0, 0x3fff ) | 0x8000,
      mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
      );
    }
    

    您可以向GA报告各种数据,请参阅https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#content

    【讨论】:

      【解决方案2】:

      由于您已经为您的 .exe 文件提供了直接访问链接,因此您可以跟踪下载的唯一方法是在 apache 访问日志(或您正在使用的任何 Web 服务器软件的访问日志)中查看它。

      或者,如果您使用共享主机(可能使用 cPanel),您可能已经拥有一些日志统计工具,例如 awstats。

      更好的方法是编写小脚本(例如download.php),它会在打开时将条目写入数据库,然后将exe文件转发给用户。这样您就可以拥有每次下载的数据库。

      然后您将共享http://yoursite.com/download.php,它将充当下载计数器。

      【讨论】:

      • 我已经分享了数百个站点的链接以及 ID,但我无法对它们做任何事情。我是新手,不会写剧本。如果你能在这方面帮助我。我会非常感谢你。
      • 我能为你做的不多。您是托管自己的服务器,还是使用共享(cPanel 或类似)托管?
      • 我有自己的服务器@D.Kasipovic
      • 然后打开/var/log/apache2/access.log 或类似的文件,然后解析、grep、sed,无论何时下载文件。 cat /var/log/apache2/access.log | grep "yourfile" 之类的东西应该可以帮助您入门。如果您将其传送到wc -l,您将获得下载次数。
      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多