Axels Homepage


Sie sind hier: » PC + Co. » PHPCMS » Download-Counter

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


 
©2010 by Axel Hahn - powered by
Valid HTML 4.01!