Downloads nur für angemeldete Kunden

Voraussetzung: Das Modul Kundenverwaltung muss aktiviert und eingerichtet sein.


In diesem Beispiel geht es darum, bestimmte Dokumente nur eingeloggten Kunden zur Verfügung zu stellen.

Die Dokumente selbst werden mit einer .htaccess-Datei geschützt.
Die .htaccess-Datei liegt dabei in dem Verzeichnis, in dem die Download-Dateien abgelegt sind. In dieser werden einfach alle Dateiaufrufe auf eine bestimmte Seite umgeleitet. Diese Seite wiederum überprüft, ob der aktuelle Webseitenbesucher ein eingeloggter Kunde ist oder nicht. Besitzt der Besucher der Website die nötigen Zugriffsrechte (ist eingeloggter Kunde), dann wird an ihn die angeforderte Datei ausgeliefert. Besitzt er nicht die nötigen Zugriffsrechte, wird ihm eine entsprechende Meldung angezeigt.

Inhalt der .htaccess Datei

Die Aufrufe werden an die Seite "download.php" umgeleitet. Der Pfad zur angeforderten Datei wird hierbei als Parameter "file" weitergegeben.

RewriteEngine on

RewriteRule (.+) /download.php?file=$1


Vorlage der dynamischen webEdition-Seite "download.php"

HINWEIS: Der nachfolgende Code dient lediglich als Orientierung. Er sollte so nicht im Produktivsystem eingesetzt werden.

<we:sessionStart/><we:ifRegisteredUser><?php

/* Wir setzen hier PHP >8 vorraus */

$expiry = 86400; //Cache der Datei auf 1 Tag setzen (in Sekunden)

function returnString(int $code): string{
    $str = returnCode($code);
  we_html_tools::setHttpCode($code);
    return '<!doctype><ht' . 'ml><he' . 'ad><title>' . $code . ' - ' . $str . '</title></head><body><h1>' . $code . ' - ' . $str . '</h1><p>' .
            match($code){
                default => 'interner Fehler',
                401 => 'Sie sind nicht am System angemeldet.',
                403 => 'Ihre Rechte reichen nicht um die Datei anzuzeigen',
                404 => 'Die Datei existiert nicht, vermutlich ist der Link alt.',
            } .
            '</p></bo' . 'dy></ht' . 'ml>';
}
// Grobe Manipulationen am Pfad abfangen
$str_file = (string) strip_tags($_GET['file']);
$str_file = str_replace('../', '..', $str_file);
$file = (string) realpath($str_file);
$mainroot = (string) realpath(WEBEDITION_PATH . '..');
$we_path = str_replace($mainroot, '', $file);

if(!$file||!file_exists($file)){ //Datei existiert nicht
    echo returnString(404);
    return;
}

$stat = stat($file);
if(!$stat){//Datei nicht lesbar
    echo returnString(404);
    return;
}
// Nur wenn die angeforderte Datei auch existiert...

//Optimierungen um erneutes lesen zu vermeiden
$etag = md5($file . $stat['size'] . $stat['ctime'] . $stat['mtime']);
if(
        (isset($_SERVER['HTTP_IF_NONE_MATCH']) && ($etags = array_filter(explode(',', $_SERVER['HTTP_IF_NONE_MATCH']))) && in_array($etag, $etags, true)) ||
        (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && ($_SERVER['HTTP_IF_MODIFIED_SINCE'] === gmdate('D, d M Y H:i:s', $stat['mtime']) . ' GMT'))
){//Datei ist gleich wie im Cache - also nicht ausliefern
    header('HTTP/1.1 304 Not Modified');
    header('Etag: ' . $etag);
} else {
    header_remove('Pragma');
    $finfo = finfo_open(FILEINFO_MIME);
    if(!$finfo){
        return;
    }
    header('Content-Type: ' . finfo_file($finfo, $file));
    finfo_close($finfo);
    header('Cache-Control: private, max-age=' . $expiry);
    if(we_tagIf('ifClient', ['browser' => 'edge']) && strpos($file, '.pdf')){
        header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    }
    header('Content-Length: ' . $stat['size']);
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $stat['mtime']) . ' GMT');
    header('Etag: ' . $etag);
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expiry) . ' GMT');
    while(ob_get_level()){
        ob_end_flush();
    }
    readfile($file);
}
exit;
?><we:else/><?php
echo returnString(401);
?></we:ifRegisteredUser>
powered by webEdition CMS