echo $begrüßung;
Ich verstand es bisher immer so, dass DOCUMENT_ROOT das Webseitenverzeichnis ist. Das hat bei mir bisher bei 3 verschiedenen Hostern geklappt, anscheinend gibt es aber welche, bei denen das DOCUMENT_ROOT ein paar Ebenen höher liegt, als das für den User mittels FTP und HTTP erreichbaren »Webseitenverzeichnis«.
De facto ist das DocumentRoot definiert als das reale Verzeichnis im Dateisystem, das bei http://example.com/datei dem Verzeichnis entspricht, in dem "datei" liegt (wenn man von einer 1:1-Zuordnung von Ressourcen auf Dateien ausgeht). Bei einem Webhoster muss nicht zwangsläufig das DcumentRoot dem Kundenverzeichnis entsprechen. Oft ist das so, aber das hat schließlich den Nachteil, dass dann alle Kundendateien aus dem Web erreichbar sind (wenn man das Ausliefern nicht in der Verzeichniskonfiguration verbietet). Empfehlenswert ist, im Kundenverzeichnis Unterverzeichnisse anzulegen und die DocumentRoots dorthin zeigen zu lassen.
/kunden/kundeX/ = KundenRoot (und oftmals auch DocumentRoot)
/kunden/kundeX/domainA/ = DocumentRoot der Domain A
/kunden/kundeX/domainA/galleries/ = Galerien-Verzeichnis im DocumentRoot
/kunden/kundeX/galleries/ = Galerien-Verzeichnis außerhalb des DocumentRoots
Die letzte Möglichkeit lassen wir mal aus, das kann der Fortgeschrittene selbst implementieren.
Der Kunde hat mit FTP Zugriff auf /kunden/kundeX/, also sein KundenRoot mit all seinen DocumentRoots darin. DocumentRoot sollte wohl besser DomainDocumentRoot heißen.
Seltsam auch bei PHP (und bei mir, also bei 1&1 gehostet):
$ENV{DOCUMENT_ROOT} (Perl) oder $_SERVER[DOCUMENT_ROOT] (PHP) ergeben:
/kunden/homepages/12/d123456879/htdocs/aec
aber... realpath(irgenwas) ergibt:
/homepages/12/d123456879/htdocs/aec
Das ist ein vermutlich historisch bedingtes "Problem". Meine Interpretation dazu ist, dass es früher mal ein reales Verzeichnis /kunden/homepages/ gab, das mittlerweile um die überflüssig gewordene Ebene /kunden/ gekürzt wurde und heute nur noch /homepages/ heißt. Dummerweise gab es Konfigurationen und Kundenscripte, die fest kodiert /kunden/homepages/ verwendeten und nun weiterhin funktionieren mussten. Also legte man in / einen Symlink namens kunden an, der auf / verweist. Verwendet man /kunden ist das real gesehen gleich /, beziehungsweise /kunden/homepages/ entspricht real /homepages/. Im Apachen ist das DocumentRoot immer mit /kunden konfiguriert. Und realpath() löst nicht nur .. auf sondern auch solche Symlinks.
»/kunden« ist weg... da kann man solche überprüfungen einbauen, von wegen wenn das in dies nicht enthalten ist, dann path violation! Dann stimmt es nie und nimmer nie!
Deswegen setze ich auch nicht auf die direkten Angaben im Script sondern löse sie mit realpath() in ihre schnörkellose, real existierende Form auf.
Ich will für die Neufassung meines GBs eine Installationsroutine machen, die scheitert im reinen Perl aber daran, dass sich das »Webseitenverzeichnis« nicht ermitteln läßt. Leider werde ich auf PHP zurückgreifen müssen, um die Pfade zu ermitteln, weil... aargh, je nach Hoster Perl nur innerhalb des cgi-bin-Verzeichnisses ausführbar ist. Wie soll ich dann ein vom DOCUMENT_ROOT abweichendes »User-Verzeichnis« ermitteln lassen? Das geht nur mit PHP, weil dies überall ausführbar ist.
Das Userverzeichnis (oder KundenRoot) lässt sich nicht ermitteln. Es gibt keine Konvention, dafür eine Umgebungsvariable oder dergleichen zu erstellen, wie es beim DocumentRoot der Fall ist.
» Gut, dann war das quasi überflüssig, es zu erstellen.
Aber nein! Das klingt jetzt so enttäuscht von Dir...
Achwas. Ich verwende beim Tippen immer emotionslose Buchstaben.
Das Problem ist, dass wir nicht wissen, so wir denn sowas etwas allgemeiner anbieten wollen, ob die User einen speziellen Galerie-Verzeichnis haben. So könnte es sein, dass ein User eine Galerie in /abc, eine zweite in /def hat - und dennoch ein Skript dafür benutzen möchte...
Wir definieren einfach die Best Practice, die wird im Artikel beschrieben und wenn jemand davon abweicht, ist das seine Anpassungsangelegenheit. Ich hab es ja einigermaßen flexibel implementiert (denke ich).
Best Practice wäre meiner Ansicht nach ein Basisverzeichnis für alle Galerien und darin in beliebiger Tiefe die Galerie-Verzeichnisse.
echo "$verabschiedung $name";