Bilder ausserhalb des Doc Root "lagern"

südpol

Erfahrenes Mitglied
Hi,

hab jetzt schon alle Suchen abgegrast, die ich kenne. Leider konnte ich keine Lösung für mein "Problem" finden welches wie folgt aussieht:

Ich baue mir gerade eine neue HP und möchte auf dieser meine Bilder ausserhalb des Dokument Roots des Webservers lagern, da ich in meinen Logs verstgestellt habe, dass ein Großteil des Traffics durch fremde Seiten verursacht wird... Die Bilder sollen jedoch nicht zum Download angeboten werden (dazu habe ich unmengen an Beispielen gefunden) sondern sollen im img - tag angezeigt werden.

Kann mir jemand sagen, wie das Funktioniert?

Danke
 
Schreibe dir ein Skript, welches den Inhalt eines entsprechenden Bildes ausließt und sende es an den Benutzer:
PHP:
<?php

	header('Content-Type: <Media-Typ>');
	header('Content-Length: ' . filesize('<absoluter Pfad>'));

	readfile('<absoluter Pfad>');

?>
 
Hi,

hmm ich dachte, wenn ich die header informationen sende wird das als "extra Bild" dargestellt. Ist dem nicht so? :confused:

hmm folgendes müsste somit funktionieren:

PHP:
$file = "nicht_im_doc_root/bild.jpg";
$img = fopen($file, "r");
header("conenttypes: image/jpeg");
echo fread($img, filesize($file));
fclose($img);

und dass dann für jedes Bild? richtig?

Gruß
 
Nicht ganz, denn das HTTP-Header-Feld contenttype existiert laut den der offiziellen Definition nicht und sollte daher nicht berücksichtigt werden.

Weitergehend könntest du mit dem Apache-Module mod_rewrite auch folgendes einrichten:
Code:
RewriteBase	/
RewriteCond	%{REQUEST_FILENAME}	-f			[OR]
RewriteCond	%{REQUEST_FILENAME}	-d
RewriteRule	bilder/(.*)$		/bilder.php?filename=$1	[QSA]
PHP:
<?php

	$filename = ( isset($_REQUEST['filename']) && trim(basename($_REQUEST['filename'])) !== '' )
		?	trim(basename($_REQUEST['filename']))
		:	NULL;
	$filepath = '' . $filename;
	$pathinfo = pathinfo($filename);

	$mediatypes = array(
		'gif'	=> 'image/gif',
		'jpg'	=> 'image/jpeg',
		'png'	=> 'image/png'
	);

	if( $filename === NULL || !is_file($filepath) || !isset($pathinfo['extension']) || !isset($mediatypes[strtolower($pathinfo['extension'])]) ) {
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		exit();
	}

	$last_mod = filemtime($filepath);
	$etag = md5($last_mod);

	$httpheaders = array(
		'Cache-Control'		=> 'private, must-revalidate, max-age=604800',
		'Vary'			=> 'Accept-Encoding',
		'Content-Type'		=> $mediatypes[$pathinfo['extension']],
		'Content-Length'	=> filesize($filepath),
		'Last-Modified'		=> gmdate('D, d M Y H:i:s', $last_mod).' GMT',
		'Expires'		=> gmdate('D, d M Y H:i:s', (time()-$last_mod)+time()).' GMT',
		'ETag'			=> $etag
	);

	foreach( $httpheaders as $httpheader_fieldname => $httpheader_fieldvalue ) {
		header($httpheader_fieldname.': '.$httpheader_fieldvalue);
	}

	if(	(	isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
		  &&	strstr($_SERVER['HTTP_IF_MODIFIED_SINCE'], gmdate('D, d M Y H:i:s', $last_mod) . ' GMT') )
	   ||	(	isset($_SERVER['HTTP_IF_NONE_MATCH'])
		  &&	strpos($_SERVER['HTTP_IF_NONE_MATCH'], $etag) )
	   ) {
		header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
		exit;
	}

	readfile($filepath);
	exit();

?>
 
Zuletzt bearbeitet:
Hi,

ich hoste meine Webseiten auf einem Mangared Server daher habe ich keinen Zugriff auf die apache config ;) aber danke für die Beschreibung - kann ich evtl. im Intranet mal einsetzen ;)

Gruß
 
geht das nicht so wie Gumbo gesagt hat (z.B. bla.php)
<?php
header('Content-Type: <Media-Typ>');
header('Content-Length: ' . filesize('<absoluter Pfad>'));
readfile('<absoluter Pfad>');
?>
und dann
<img src="bla.php" ... />
musst halt irgendwas eindeutiges pro bild mit übergeben
bin mir aber nicht sicher
flooo
 
Um ehrlich zu sein, hab ich garnichts gesagt – oder hat mich jemand sprechen gehört?


Dennoch stimmt es, dass mein erster Vorschlag funktionieren würde.
Allerdings ist mein zweiter Vorschlag wesentlich besser geeignet, da einerseits bereits ein Parameter zur Übergabe des Dateinamens, und andererseits die Möglichkeit des „Chaching“ implementiert ist.
 
Zurück