Hallo Thomas,
ich poste Dir einfach mal ein Script, was ich seit einer Weile ohne Probleme verwende. Eigentlicher Zweck ist bei mir eine rudimentäre Referer-Kontrolle zur Traffic-Schonung, aber das sollte sich leicht auf Deine Bedürfnisse umstellen lassen.
Dabei ist /grafiken/versteckt/ per .htaccess gesperrt, kann aber natürlich auch ein Pfad ausserhalb der DOCROOT sein.
Ich hab die für Dich unwesentlichen Teile durch /* ... */ ersetzt. Alle entscheidenden Punkte sind vorhanden.
<?php
Standard-Aufruf: bild.php?bild=/grafiken/versteckt/bild.jpeg
error_reporting( E_ALL );
$DOCUMENT_ROOT = getenv( 'DOCUMENT_ROOT' );
$nicht_gefunden_pfad = $DOCUMENT_ROOT . '/images/404.jpg';
$falscher_referer_pfad = $DOCUMENT_ROOT . '/images/403.jpg';
$header_gif = 'Content-type: image/gif';
$header_jpeg = 'Content-type: image/jpeg';
$header_png = 'Content-type: image/png';
$HTTP_REFERER = getenv( 'HTTP_REFERER' );
$referer_ok = false;
$allowed_referers = array(
/* ... */
); # $allowed_referers = array(
Wurde ein Bild uebergeben?
if( ! isset( $bild ) OR $bild == '' )
{
header( $header_jpeg );
readfile( $nicht_gefunden_pfad );
return;
} # if( ! isset( $bild ) OR $bild == '' )
Soll der Referer gecheckt werden? Wenn denn einer vorhanden ist ;)
if( ! isset( $bild_php_kein_referer_check ) AND $HTTP_REFERER != '' )
{
/* Code, um den Referer zu checken */
}
else # if( ! isset( $bild_php_kein_referer_check ) )
{
$referer_ok = true;
}
Referer ok?
if( ! $referer_ok )
{
header( $header_jpeg );
readfile( $falscher_referer_pfad );
return;
} # if( ! $referer_ok )
$datei_uri = str_replace( '//', '/', '/vorgegebenes_verzeichnis/'. urldecode( $bild ) );
$datei_pfad = $DOCUMENT_ROOT . $datei_uri;
Gibt es das Bild?
if( ! file_exists( $datei_pfad ) )
{
header( $header_jpeg );
readfile( $nicht_gefunden_pfad );
return;
} # if( ! file_exists( $datei_pfad ) )
Korrekten Header senden
switch( strtolower( $datei_pi['extension'] ) )
{
case 'gif':
header( $header_gif );
break 1;
case 'png':
header( $header_png );
break 1;
case 'jpg':
case 'jpeg':
default:
header( $header_jpeg );
break 1;
} # switch
Letzte Aenderung durchreichen
if( ! isset( $last_modified ) OR $last_modified == '' )
{
$datei_zeit = filemtime( $datei_pfad );
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s', $datei_zeit ) . ' GMT' );
}
else
{
header( $last_modified );
}
Soll der korrekte Name zum Speichern mit angegeben weren? Eigentlich ja, aber zB bei naechster_hthumb.php nicht
if( ! isset( $bild_php_dont_give_name ) )
{
header("Content-Disposition: attachment; filename="" . basename( $datei_pfad ) . """);
}
readfile( $datei_pfad );
return;
?>
Gruss, Thoralf