php und symbolische links

D

dbr

Mitglied
Thread Starter
Dabei seit
28.05.2005
Beiträge
45
Reaktionspunkte
0
pro's gefragt: php und symbolische links

habe ein ziemlich schwerwiegendes etwas ominöses problem:

habe mehrere webprojekte die mit den selben php-scripts arbeiten, jedoch jeweils eine eigene datenbank verwenden.

dazu habe ich mit ln -s symolische links erstellt die auf bestimmte verzeichnisse linken in denen die scripts zentral bereitstehen.

das ganze sieht ca. so aus:
/scriptdir/admin/
/scriptdir/lib/
/scriptdir/upload

und für ein jeweiliges projekt folgende verzeichnisstruktur:
/project/admin -> ../scriptdir/admin
/project/lib -> ../scriptdir/lib
/project/upload -> kein link!!

das problem ist jetzt folgendes.. wenn ich im projektfolder /admin/ ein uploadscript (upload.php) ausführe.. und ich der move_uploaded_file funktion einen relativen pfad zum uploadverzeichnis angebe also "../upload/uploadedfile.ext"


aus irgendeinem mir unersichtlichen grund führt diese angabe nicht zum /project/upload folder... sondern in den /scriptdir/upload folder... d.h. das script lässt sich vom symolischen link nicht "täuschen" und geht vom original aus (also der pfad unter dem das script tatsächlich lieggt (/scriptdir/admin/upload.php )

hoffe ich konnte es einigermaßen verständlich formulieren.

hat jemand eine idee wie man dieses problem lösen könnte... ?

big thx in advance!

Dbr
 
Zuletzt bearbeitet:
ich vermute, dass der pfad des upload-dirs relativ zu deiner zentralen installation ermittelt wird. sprich: aus der sicht des skriptes wird der upload-pfad richtig ermittelt - was dir natürlich nicht weiterhilft. es scheint aber alles OK zu sein.

du könntest den pfad zum "richtigen" upload "hart-verdrahten"... z.B.

$folder = $clientBaseFolder."/upload/";

echo $clientBaseFolder könnte z.B. sein:
/var/www/kunde_1

echo $folder wäre dann z.B.
/var/www/kunde_1/upload/


hoffe, das hilft weiter.
gruss, cat.
 
Oder Du baust Dir eine Funktion die den Pfad übersetzt. An den aktuellen Pfad kommst Du per $_SERVER["PATH_TRANSLATED"]. Dann brauchst Du eine Funktion die den relativen Pfad auf diesen Absoluten anwendet.

Diese Funktion könntest Du vom jeweiligen Nutzer (falls es z.B. um virtual Hosting geht) verstecken indem Du sie in die Funktion move_uploaded_file einbindest.

-originale move_uploaded_file-Funktion umbenennen: rename_function()
-eigene Funktion move_uploaded_file erstellen, die die Pfadumwandlung enthält und die orignale move_uploaded_file-Funktion danach aufruft.

Das ganze kannst Du in eine Datei schreiben die Du grundsätzlich in PHP einbindest (php.ini -> auto_prepend_file)

Ist ein dreckiger Hack, aber sollte funktionieren. :)
 
Zuletzt bearbeitet von einem Moderator:
"dreckiger hack" in kombination mit "file upload" erzeugt bei mir eine gänsehaut :)
 
Aus welchem Grund kein absoluter Pfad bei der Uploadfunktion?

Oder sonst mit document root (gibt URL an, nicht Filesystem) ($_SERVER["DOCUMENT_ROOT"]/project/upload/)
 
Jakob schrieb:
Oder sonst mit document root (gibt URL an, nicht Filesystem) ($_SERVER["DOCUMENT_ROOT"]/project/upload/)

documentroot ist nicht immer gleich speicherort der projektdateien. das ist doch nur das wurzelverzeichnis des webservers.

in dem fall wären alle projekte öffentlich zugänglich, das sie unterhalb des roots liegen.
 
Zuletzt bearbeitet:
Es ist der upload-Ordner. Sehe kein Problem drin, das der per URL zugänglich ist. Wenn er's denn ist, sonst geht's nicht damit, ja.
 
ich arbeite bei sowas mit virtuellen hosts in der httpd.conf und kann so per

/path/to/somewhere/$_SERVER['HTTP_HOST']/...

beliebig unterscheiden. Auf die Art betreibe ich bequem 5 Webserver auf einem PIII mit 500 MHz :)
 
Jakob schrieb:
Es ist der upload-Ordner. Sehe kein Problem drin, das der per URL zugänglich ist. Wenn er's denn ist, sonst geht's nicht damit, ja.

wenn es nur der ist, dann ist es ok. in deinem beispiel ist aber der upload-ordner unterhalb des projektes

> $_SERVER["DOCUMENT_ROOT"]/ !! project !! /upload/

du meintest bestimmt

> $_SERVER["DOCUMENT_ROOT"]/upload/
 
Ein anderer Weg wäre die Defintion des basefolders in der vhost-conf

SetEnv MyBaseDir /var/www/kunde1/

Der Wert steht dann immer über $_SERVER['MyBaseDir'] innerhalb der Anwendungen zur Verfügung.
 
wegus schrieb:
ich arbeite bei sowas mit virtuellen hosts in der httpd.conf und kann so per

/path/to/somewhere/$_SERVER['HTTP_HOST']/...

beliebig unterscheiden. Auf die Art betreibe ich bequem 5 Webserver auf einem PIII mit 500 MHz :)

das halte ich nicht für eine gute lösunge, da deine verzeichnisstruktur dann immer von domainnamen der website abhängig ist. das klappt z.B. nur, wenn du pro domainname einen eigenen ordner anlegst. bei suddomains wird es z.B. schwierig.
 
Zurück
Oben Unten