Search code examples
phphtmlapache.htaccessstatistics

Best way to track (direct) file downloads


What is the best method to track direct file downloads?

Google Analytics only works with javascript, can't track direct file downloads.

Best would be a secure and own hosted solution.


Solution

  • Feel free to use :)

    .htaccess:

    RewriteEngine on    
    RewriteRule ^(.*).(rar|zip|pdf)$ http://xy.com/downloads/download.php?file=$1.$2 [R,L]    
    

    mysql:

    CREATE TABLE `download` (
        `filename` varchar(255) NOT NULL,
        `stats` int(11) NOT NULL,
        PRIMARY KEY  (`filename`)
    )
    

    download.php

    <?php
    
    mysql_connect("localhost", "name", "password")
    or die ("Sorry, can't connect to database.");
    mysql_select_db("dbname"); 
    $baseDir = "/home/public_html/downloads"; 
    $path = realpath($baseDir . "/" . basename($_GET['file'])); 
    
    if (dirname($path) == $baseDir) {
    if(!is_bot())
    mysql_query("INSERT INTO download SET filename='".mysql_real_escape_string(basename($_GET['file']))."' ON DUPLICATE KEY UPDATE stats=stats+1");
    
    
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=" . basename($_GET['file']));
    header("Content-Length: ".filesize($path));
    header("Content-Type: application/force-download");
    header("Content-Transfer-Encoding: binary");
    ob_clean();
    ob_end_flush();
    readfile($path);    
    }
    
    function is_bot()
    {
    
        $botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
        "looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
        "Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
        "crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
        "msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
        "Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
        "Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
        "Butterfly","Twitturls","Me.dium","Twiceler");
    
        foreach($botlist as $bot)
        {
            if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
            return true;    // Is a bot
        }
    
        return false;
    }
    
    ?>