2011-01-08 10 views
1

Ich entwickle und vertreibe verschiedene PHP-Anwendungen in verschiedenen Umgebungen. Besonders in Entwicklungsumgebungen können sie überall sein, von document_root bis/Users/me/Sites/oder sogar/Users/me/Sites/someapp/PHP: Wie bekomme ich den Document Root aus einem Benutzerverzeichnis?

In diesen Anwendungen muss ich wissen, wo der 'Anwendungsstamm' ist, einmal als echter Pfad und einmal als URL. Pfad ist kein Problem. Lassen Sie uns sagen, dass ich eine bootstrap.php im App-Stammverzeichnis haben, das tut:

define("BASE_DIR", realpath(dirname(__FILE__))); 

Allerdings habe ich Probleme haben, um zuverlässig die Basis-URL zu bekommen. Auf den meisten Umgebungen einfach Dokumentstamm von BASE_DIR Subtrahieren funktioniert:

define("BASE_URL", str_replace($_SERVER['DOCUMENT_ROOT'],'',BASE_DIR) . "/"); 

Nun, mein Problem ist: Das funktioniert nicht auf Umgebungen, in denen mein app in meinem Benutzerverzeichnis liegt, weil PHP sieht nach wie vor das Hauptdokument Wurzel. Hat jemand dieses Problem gelöst?

+0

möglich duplicate of [Wie finde ich die Basis-URL einer Anwendung?] (http://stackoverflow.com/questions/176712/ how-can-i-find-an-applications-base-url) – alexn

+0

Danke, aber ich habe gerade die Lösung dort ausprobiert und das Ergebnis hängt davon ab, wo sich die Datei einschließlich des angegebenen Codes befindet. – Stefan

+0

Oder besser gesagt: Die Lösung erfordert, dass sich die bootstrap.php immer im Root-Verzeichnis befindet (obwohl ich der Einfachheit halber das Gegenteil gesagt habe, hatte ich es in einem "includes /" -Verzeichnis). Aber ich denke, die einfachste Lösung besteht darin, sie nach oben zu verschieben und die hier verknüpfte Lösung zu verwenden. – Stefan

Antwort

4

Alles, was realpath() und DOCUMENT_ROOT betrifft, wird schwer ausfallen, wenn der Server Aliase konfiguriert hat. Betrachten wir ein Szenario, in dem Apache eine Konfiguration wie diese bekommen:

DocumentRoot /home/httpd/html 
Alias /testalias /home/otherdir 

Und Sie Zugriff auf ein Skript bei example.com/testalias/script.php.

Das Skript wird zurück:

realpath(dirname(__FILE__)) -> /home/otherdir 
$_SERVER['DOCUMENT_ROOT'] -> /home/httpd/html 
BASE_DIR -> /home/otherdir 
BASE_URL -> /home/otherdir/ 

und doch ist der Rest der Seite existiert tatsächlich in /home/httpd/html

Vielleicht haben Sie mehr Glück, die der Name Pfad/script ist die Rekonstruktion der auf $_SERVER['SCRIPT_NAME'] Basis URL haben Teil der URL:

$_SERVER['SCRIPT_NAME'] -> /testalias/script.php 
+0

Was ist die Lösung, die von alexn als mögliches Duplikat verlinkt wurde? Und ich denke, er hat Recht, die Frage ist die gleiche, aber ich denke immer noch, dass die Lösung dort nur in einer Bootstrap-Datei im Stammverzeichnis der Anwendung funktioniert. http://stackoverflow.com/questions/176712/how-can-i-find-an-applications-base-url/185725#185725 – Stefan

+0

Ich verwende dies, wenn ich Alias-Verzeichnis str_replace ($ _ SERVER ['SCRIPT_NAME' verwenden ], '', $ _SERVER ['SCRIPT_FILENAME']) – kiranvj

+0

Das Problem mit SCRIPT_NAME besteht darin, dass es nicht statisch ist, da es auf dem Namen des aktuell ausgeführten Skripts basiert. Bevor Apache 2.3.x populär wird, können wir die Variable CONTEXT_PREFIX verwenden. Ich fürchte, es gibt keine Lösung. – devXen

Verwandte Themen