problem mit php und htaccess
OrangeEDE
- php
Hallo zusammen
ich hab in einen Ordner Bilder der mit htaccess geschützt ist
in dem ordner sind wieder einzelne ordner mit bildern
hab jetzt ein script das alle bilder der einzelnen unter ordner anzeigt
problem ist jetzt nur wie kann ich die bilder anzeigen lassen kann ohne dass des login fenster erscheint?
hab schon gelesen dass ich serverseitig darauf zugreifen kann aber wie?
hoff ihr könnt mir helfen
ich hab in einen Ordner Bilder der mit htaccess geschützt ist...
problem ist jetzt nur wie kann ich die bilder anzeigen lassen kann ohne dass des login fenster erscheint?
hab schon gelesen dass ich serverseitig darauf zugreifen kann aber wie?
Du könntest/müßtest alle Bilder über ein script ausliefern. Du bindest mit scr="" nicht die Bilder ein, sondern ein script mit einem Parameter, welches das Bild identifiziert (scr="script.php?bild=bildname"). Das script müßte dann den richtigen header senden und das Bild laden und hinterhersenden.
Schau z.B. mal im manual bei http://de.php.net/manual/de/function.readfile.php.
Das script müßte natürlich noch wissen, ob es das Bild ausliefern darf, irgendwann, irgendwo und irgendwie müßte sich der Besucher also als berechtig ausweisen.
ich hab in einen Ordner Bilder der mit htaccess geschützt ist...
problem ist jetzt nur wie kann ich die bilder anzeigen lassen kann ohne dass des login fenster erscheint?
hab schon gelesen dass ich serverseitig darauf zugreifen kann aber wie?
Du könntest/müßtest alle Bilder über ein script ausliefern. Du bindest mit scr="" nicht die Bilder ein, sondern ein script mit einem Parameter, welches das Bild identifiziert (scr="script.php?bild=bildname"). Das script müßte dann den richtigen header senden und das Bild laden und hinterhersenden.
Schau z.B. mal im manual bei http://de.php.net/manual/de/function.readfile.php.
Das script müßte natürlich noch wissen, ob es das Bild ausliefern darf, irgendwann, irgendwo und irgendwie müßte sich der Besucher also als berechtig ausweisen.
also ich brauch dann eine datei (sript.php) wo der header und des readfile drin steht und dann über get z.b. 001 übergeben (script.php?bild=001) dass er des bild 001.jpg ( $GET_['bild'] ) nimmt und des dann in des des readfile reinschreiben ? versteh ich dich da richtig?
und wo tu ich dann die datei hin
in den geschützten bereich oder außerhalb?
also ich brauch dann eine datei (sript.php) wo der header und des readfile drin steht und dann über get z.b. 001 übergeben (script.php?bild=001) dass er des bild 001.jpg ( $GET_['bild'] ) nimmt und des dann in des des readfile reinschreiben ? versteh ich dich da richtig?
Ja.
und wo tu ich dann die datei hin
in den geschützten bereich oder außerhalb?
Außerhalb, sie muß ja erreichbar sein.
Ich habe das vor ein paar Jahren mal für eine eigene phpBB-Lösung mit eng begrenztem Personenkreis gemacht. Der Code ist aber nicht up to date. Z.B. sollte man noch überprüfen, ob der über GET übergebene Bildname überhaupt existiert.
...
if ( $userdata['session_logged_in'] )
{
// Code, wenn ein Benutzer angemeldet ist
$bild = $_GET["b"];
header("Content-Type: image/jpeg");
header("Content-Disposition: attachment; filename=$bild");
readfile ("images/".$bild);
}
else
{
// Code, wenn kein Benutzer angemeldet ist
header("Content-Type: image/jpeg");
header("Content-Disposition: attachment; filename=$bild");
readfile ("images/verboten.jpg");
}
?>
Übrigens, mein Hoster berechnet den Traffic für die Bilder dann doppelt, vermutlich weil sie vom script 1x gelesen und 1x gesendet werden. Ich weiß nicht wie andere das halten und meinen Hoster habe ich noch nicht darauf angesprochen, ob das ein Fehler ist, da ich immer weit weg vom Limit bin.
<?php
echo "<img src='test.php?bild=001'>";
?>
________________________________________
<?php
$verzeichnis = "../bilder/mimoalmina/";
$endung = ".jpg";
header("content-type: image/jpeg");
header("pragma: cache");
$picName = $verzeichnis . $GET_['bild'] . $endung;
if (file_exists($picName)) {
readfile($picName);
exit;
}
else {
header("status: 404 Not Found");
}
?>
_____________________________________________________
funktioniert so aber noch nicht
ohne des get hats noch funktioniert aber jetzt mags nich mehr
traffic hab ich eh keine begrenzung =)
funktioniert so aber noch nicht
ohne des get hats noch funktioniert aber jetzt mags nich mehr
Ohne $GET_['bild'] hat es funktioniert? Du hattest statt dessen '001' direkt drin stehen?
Was genau heißt es funktioniert nicht?
Nimm mal die header-Angaben und das readflie raus. Was kommt dann für eine php-Fehlermeldung? Was wird ausgegeben wenn Du
var_dump($GET_['bild']);
einfügst?
also wenn ich die seite mit dem src auf machen kommt das symbol für ein kaputtes foto
bei der anderen steht die adresse im bildschirm
wenn ich des rauslösch und des andere einfüg kommt nurn weißer bildschirm
Ohne des get gehts also wenn ich direkt ansprech ohne die variable
also wenn ich die seite mit dem src auf machen kommt das symbol für ein kaputtes foto
Logisch, da kommt irgendwas von dem behauptet wird es wäre ein Bild, ist es aber nicht.
bei der anderen steht die adresse im bildschirm
Du meinst wenn Du das script (test.php?bild=001) direkt aufrufst? Was für eine Adresse?
wenn ich des rauslösch und des andere einfüg kommt nurn weißer bildschirm
Hast Du das php error_reporting an? Wenn nicht, dann mach es an.
Ohne des get gehts also wenn ich direkt ansprech ohne die variable
Dann kommt aus $GET_['bild'] offenbar nicht 001 raus. Deshalb hatte ich dich gebeten Dir das mit var_dump() ausgeben zu lassen. Da darf keine weiße Seite kommen, selbst wenn $GET_['bild'] leer ist.
Hello,
<?php
echo "<img src='test.php?bild=001'>";
?>________________________________________
<?php
$verzeichnis = "../bilder/mimoalmina/";
$endung = ".jpg";header("content-type: image/jpeg");
header("pragma: cache");
$picName = $verzeichnis . intval($_GET['bild']) . $endung;
if (file_exists($picName))
{
readfile($picName);
exit;
}
else
{
header("status: 404 Not Found");
}
?>
_____________________________________________________funktioniert so aber noch nicht
Konnte auch nicht, weil Du $GET_ anstelle von $_GET geschrieben hattest.
Außerdem empfehle ich dringend, die Nummer des Bildes auch als solche zu behandeln, damit Du dir keine Sicherheitslücke einbaust in das Script.
Haben die Bilder keine Präfixe mehr vor ihrem '001' usw?
Also z.B. 'pic001.jpg'?
Wenn Du '001' anstelle von '1' benötigst, müsstest Du dir den String entsprechend links auffüllen mit den führenden Nullen.
Z.B. $bild = substr('000' . intval($_GET['bild']),-3);
Die Abfrage auf file_exists() ist zwar ganz nett, aber eigentlich nur gültig, wenn der Bestand an Bildern sich während der Laufzeit des Scriptes nicht verändert. Das nur der Vollständigkeit halber.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Kleine Ergänzung noch:
Die Header für das Bild gehören natürlich auch in den True-Zweig des If und nicht davor!
<?php
$verzeichnis = "../bilder/mimoalmina/";
$endung = ".jpg";
$picName = $verzeichnis . intval($_GET['bild']) . $endung;
if (file_exists($picName))
{
header("content-type: image/jpeg");
header("pragma: cache");
readfile($picName);
exit;
}
else
{
header("status: 404 Not Found");
}
?>
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
readfile ("images/".$bild);
Übrigens, mein Hoster berechnet den Traffic für die Bilder dann doppelt
das wäre aber schon sehr frech; falls das wirklich der Fall ist, würde ich mich darüber beschweren.
vermutlich weil sie vom script 1x gelesen und 1x gesendet werden.
Das ist aber Unfug. Normalerweise kannst du mit einem PHP-Script Daten lesen und schreiben, wie du lustig bist, mit dem "Traffic" hat das nichts zu tun. Darunter versteht man normalerweise nur das Datenvolumen, das dein Server (oder dein Virtual Host) über die Netzwerkschnittstelle mit seiner Umgebung austauscht.
Oder hast du im Script die Daten als HTTP-Ressource gelesen, vielleicht sogar von einem fremden Host, anstatt als Datei? Dann wäre es verständlich, dass das als Netzwerktraffic berechnet wird.
So long,
Martin
Oder hast du im Script die Daten als HTTP-Ressource gelesen, vielleicht sogar von einem fremden Host, anstatt als Datei?
Nein. Vielleicht ist es auch schon nicht mehr so, das war mir so 2005/2006 aufgefallen.