PHPCMS - Counter für Downloads
Mit einer Anweisung in der .htaccess (oder woanders in einer der Apache-Config-Files) lassen sich Requests auf bestimmte Dateitypen auf ein Skript umbiegen. So kann man den Download von http://www.example.com/downloadfile.zip auf ein Skript umbiegen, dass- einen Counter erhöht
- dann die gewünschte Datei ausliefert.
.htaccess
Auf diese Weise leiten wir eine Reihe von Extensions auf ein Skript um:
# --- download counter AddType application/octet-stream .csv .exe .mid .mp3 .xm .pdf .zip Action application/octet-stream "/php/filedownload.php?download="
Ausschnitt aus der Apache-Config
Dies bewirkt, dass der Abruf von
http://www.example.com/downloadfile.zip
schlussendlich ausführt:
http://www.example.com/php/filedownload.php?download=downloadfile.zip
PHP-Skript: Counter und Download
Unser Skript filedownload.php schreibt bei jedem Aufruf in je eine Datei pro Download-Datei einen Eintrag mit Datum, IP-Adresse und Referrer. Diese Log-Datei könne wir dann später auswerten.
Der generierte Dateiname ist:
[Webroot]/log/.ht_downloads_[Name_der_Download-Datei]
Anm.:
- Dateien, die mit ".ht" beginnen, sind in der Default-Konfiguration des Apache vor dem Zugriff geschützt - man kann sie nicht mit dem Browser abrufen.
- Webseiten mit höheren Download-Zahlen sollten in eine Datenbank statt in ein Logfile protokollieren.
- der gesamte Aufwand lohnt eh nur, wenn man keinen Zugriff auf Logdateien des Webservers hat
Anschliessend wird durch Senden des HTTP-Headers das Senden der Datei veranlasst. In nachfolgendem Beispiel gehe ich davon aus, dass die Download-Datei unterhalb des Webroot liegt. Genausogut kann aber auch eine Datei zum Download angeboten werden, die ausserhalb des Webroot liegt. Dazu ist $downloadDir anzupassen.
Aus Sicherheitsgründen werden Pfade mit ".." abgefangen, damit nicht in darunterliegende Verzeichnisse gewechselt werden kann.
Im folgenden Beispiel wird die Angabe der Download-Datei ab Webroot erwartet. Somit können ihre bereits vorhandenen Downloads sofort gezählt werden.
Um die Downloads auf ein Unterverzeichnis oder einzelne Dateien einzuschränken, können Sie nach str_replace noch weitere Prüfungen einbauen oder aber $downloadDir und den Aufruf in der .htaccess anpassen.
<php
$downloadDir = $_SERVER['DOCUMENT_ROOT']."/";
$logDir = $_SERVER['DOCUMENT_ROOT']."/log/";
if(isset($_GET['download'])) {
$filename = str_replace('../','', @$_GET['download']);
$file= $downloadDir.$filename;
if(!file_exists($file)) {
echo 'FEHLER:<br>Die Datei '.$file.' existiert nicht auf dem Server.';
die(":-(");
}
$count_file = $logDir.'.ht_downloads_'.str_replace('.','_', basename($filename));
// the writing counter
$file_pointer = fopen($count_file, 'a+');
fwrite($file_pointer, date("Ymd_His") . ":" . getenv("REMOTE_ADDR") . ":" .getenv('HTTP_REFERER'). "\n");
fclose($file_pointer);
// send the requested file to the user..
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=".basename($filename));
header("Content-Length: ".filesize($file)."\n");
$get_it = fopen($file, 'rb');
fpassthru($get_it);
}
?>
PHP-Skript des Counters
Wer Spass und Lust hat, kann eine monatliche Rotation des Logs einbauen, damit die Datei nicht zu gross wird.
Seitenanfang