Hinweis: Das ist das Ende der Metanavigation. Es folgt die Kontext-Spalte.
Hinweis: Das ist das Ende der Kontext-Spalte.
Sie sind hier:
»
PC + Co.
»
PHPCMS
»
Download-Counter
PHPCMS - Counter für Downloads
Ein einfacher Counter für Download-Files mit PHP unter Apache
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="
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);
}
?>
Wer Spass und Lust hat, kann eine monatliche Rotation des Logs einbauen,
damit die Datei nicht zu gross wird.
Seitenanfang