Olzos kleiner Weblog (alt)  |  bergische Sagen
Impressum

bloz.de

Dieses Blog-Experiment wurde halbwegs aktiv von Mitte 2006 bis Ende 2010 betrieben.
Von den 300 alten Artikel stelle ich hier aus historischen Gründen noch einige öffentlich (der Rest wandert ins Privatarchiv).

Wed, 25.02.2009
Community-Fotos

Folgendes Problem: Benutzer können in einem Community-Bereich Bilder hochladen. Diese Bilder sollen entweder a) öffentlich sein (zum Rumzeigen auch bei Freunden, die nicht in der Community sind), oder b) nur die anderen Community-Teilnehmern sehen können - alle anderen (einschliesslich Suchmaschinen) aber nicht.

Der Web-Server Apache stellt für solche geschützten Bereiche htaccess zur Verfügung. Eine Möglichkeit ist nun, jedem Benutzer einen eigenen htaccess-Account inkl. Passwort zu verpassen (kann teils automatisiert werden). Das ist aber für beide Seiten umständlich: erneute Sicherheitsabfrage für den Benutzer, knifflige Serveranpassungen z.B. bei Passwortänderungen.

Ich habe mich für eine andere Möglichkeit entschieden: das Bild unterschiedlich darstellen zu lassen; je nachdem, ob man angemeldet ist oder nicht.

Es gab dabei einige Fallstricke; deshalb notier ich das hier nochmal als kleine Anleitung, vielleicht ist es ja mal jemandem hilfreich.

1.) auf dem Webserver (Suse-Linux, Apache2) /etc/sysconfig/apache2 öffnen und in der Zeile
APACHE_MODULES="access actions alias auth auth_dbm autoindex cgi dir env
expires include log_config mime negotiation setenvif ssl suexec userdir
php4"
ein rewrite einfügen, also
APACHE_MODULES="access actions alias auth auth_dbm autoindex cgi dir env
expires include log_config mime negotiation setenvif ssl suexec userdir
php4 rewrite"
(Entfällt, falls mod_rewrite bei Euch schon eingebunden ist).

2.) wird immer wieder gerne vergessen: neustarten...
/etc/init.d/apache2 restart

3.) die Fotos liegen im Verzeichnis /upload/ - dorthin kopiere ich eine Datei htaccess. mit dem Inhalt:

<FilesMatch "jpg$">
RewriteEngine On
RewriteRule (.*)\.(jpg)$ /showupload.php?id=$1
</FilesMatch>

Zugriffe auf Fotos im Uploadverzeichnis werden also generell auf ein Skript /showupload.php umgeleitet.

4.) in $id steckt noch der ganze Serverpfad mit drin ... da es immer derselbe ist, kann ich in mittels substr() abschneiden (s.u. - anpassen).

<?
$id = substr($_GET["id"],36,50);
$fil="upload/$id.jpg";
if ($fp = @fopen($fil,"r")) {
$db = @mysql_connect ( $servername, $serveruser, $serverpw );
$q = "select hidden from upload where id='$id'";
$erg = mysql_db_query( $serverdb, $q) or die(mysql_error());
if (mysql_result($erg,0,"hidden")==1 && $_COOKIE["community"]<1) {
fclose( $fp);
$fp = fopen("upload/hidden.jpg","r");
}
header("Content-Type: image/jpeg");
imagejpeg(fpassthru($fp),"",100);
fclose($fp);
}
?>

Voraussetzungen hier sind: -
eine SQL-Tabelle UPLOAD, u.a. mit ID=Dateiname und HIDDEN=1, falls nicht öffentlich
- ein Cookie ("community") das gesetzt ist, wenn man angemeldet ist (mit "/" über Verzeichnisgrenzen hinaus)
- eine Datei upload/hidden.jpg die angezeigt wird, wenn man nicht eingeloggt ist (z.B. Test "nur für Mitglieder der Community").

Viel Erfolg!

WWW | Internet