Moin Regina,
wir verfolgen den Ansatz die Dateien anhand von Verzeichnissen zu schützen, deswegen musst du es eventuell ein bisschen für dich ändern.
Es gibt interne Dokumente, diese liegen beispielsweise unter /media/
intern/.
In dem internen Verzeichnis liegt eine htaccess die alle Zugriffe blockt.
Hier die Ausgabe einer Liste mit Downloads, sowohl intern als auch öffentlich. Wir prüfen ob Dateien in einem Verzeichnis "intern" liegen und schreiben in dem Fall einen Link auf eine Datei, der die ID des Dokuments angehängt wird.
Für Nutzer die nicht eingeloggt sind, gibt es entsprechend eine andere Darstellung der Datei (ein Schloss)
Die Includes in den Links sind SVGs, die kannst du ignorieren
Code: Alles auswählen
<ul class="downloads">
<we:block name="download">
<we:ifNotEmpty name="download">
<we:link name="download" only="href" to="global" nameto="downloadPath"/>
<we:ifVar type="global" name="downloadPath" match="/intern/" operator="contains">
<we:ifNotRegisteredUser>
<li class="item locked trigger-login">
<span><we:link name="download" only="text"/> <we:include type="template" id="79" /> <we:include type="template" id="63" /></span>
</li>
<we:else />
<li class="item">
<a href="/_extras/helper/download.php?f=<we:link name="download" only="id"/>" download><we:link name="download" only="text"/> <we:include type="template" id="63" /></a>
</li>
</we:ifNotRegisteredUser>
<we:else />
<li class="item">
<a href="<we:link name="download" only="href"/>" download><we:link name="download" only="text"/> <we:include type="template" id="63" /></a>
</li>
</we:ifVar>
</we:ifNotEmpty>
</we:block>
</ul>
Die downloads.php bekommt also die Anfrage mit der ID und kann jetzt, je nach Berechtigung die Datei zurückgeben oder eben nicht.
Geht bestimmt noch schöner, aber funktioniert auch in der 9.0.8 noch super!
Code: Alles auswählen
<we:sessionStart />
<?php
if( isset($_GET["f"]) ) {
$id = (int)$_GET["f"];
$file_name = $_SERVER["DOCUMENT_ROOT"] . '' . id_to_path($id);
$protected = false;
if( false === strpos($file_name, '/media/downloads') ) { die('this is the end...'); }
?>
<we:ifNotRegisteredUser>
<?php if( false !== strpos($file_name, '/intern/') ) { $protected = true; } ?>
</we:ifNotRegisteredUser>
<?php
if (!$protected && file_exists($file_name)) {
header("Content-type: application/x-download");
header("Content-Disposition: attachment; filename=" . basename($file_name));
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file_name));
ob_clean();
flush();
readfile($file_name);
}
else if( $protected && file_exists($file_name) ) {
if( $_SERVER['HTTPS'] ) { $protokoll = 'https://'; } else { $protokoll = 'http://'; }
$referer = $_SERVER['HTTP_REFERER'];
$domain = $_SERVER['SERVER_NAME'];
$params = '?lgn';
$referer = str_replace(strstr($referer, '?'), $params, $referer);
if( strpos($referer, $domain) === false ) { $url = $protokoll . $domain . '/' . id_to_path(742) . $params; }
else { $url = $referer; }
header('Location: ' . $url);
}
else {
echo 'Error 404 :-( file not found!';
}
}
?>
Ein Beispiel wie das ganze aussieht, findest du hier (weiter unten auf der Seite):
https://relaunch.landesfrauenrat-hb.de/module.php
Hilft dir das weiter?