PHP: ¿Cómo obtener la raíz del documento desde el interior de un directorio de usuario?

Desarrollo e implemento varias aplicaciones PHP en diferentes entornos. Especialmente en entornos de desarrollo, pueden estar en cualquier lugar, desde document_root hasta / Users / me / Sites / o incluso / Users / me / Sites / someapp /

Dentro de estas aplicaciones, necesito saber dónde está la 'raíz de la aplicación', una vez como ruta real y una vez como URL. El camino no es un problema. Digamos que tengo un bootstrap.php en el directorio raíz de la aplicación que hace:

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

Sin embargo, tengo problemas para obtener la URL base de manera confiable. En la mayoría de los entornos, simplemente restar la raíz del documento de BASE_DIR funciona:

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

Ahora, mi problema es: esto no funciona en entornos donde mi aplicación se encuentra dentro de mi directorio de usuario porque PHP todavía ve la raíz del documento principal. Ha resuelto alguien este problema?

preguntado el 08 de enero de 11 a las 16:01

Gracias, pero acabo de probar la solución allí y el resultado que da depende de la ubicación del archivo, incluido el código dado. -

O más bien: la solución requiere que bootstrap.php esté siempre en el directorio raíz (aunque dije lo contrario por simplicidad, lo tenía en un directorio "incluye /"). Pero supongo que la solución más simple es moverlo a la parte superior y usar la solución aquí vinculada. -

1 Respuestas

Todo lo que involucre realpath () y DOCUMENT_ROOT fallará cuando el servidor tenga configurados los alias. Considere un escenario en el que Apache tiene una configuración como esta:

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

Y accedes a un guión en example.com/testalias/script.php.

El guión volverá:

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

y, sin embargo, el resto del sitio existe en /home/httpd/html

Es posible que tenga más suerte reconstruyendo la URL en función de $_SERVER['SCRIPT_NAME'], que es la parte de la ruta / nombre del script de la URL:

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

Respondido el 08 de enero de 11 a las 20:01

Que es lo que hace la solución que fue vinculada por alexn como un posible duplicado. Y creo que tiene razón, la pregunta es la misma, pero sigo pensando que la solución allí solo funciona en un archivo de arranque en la raíz de la aplicación. stackoverflow.com/questions/176712/… - Stefan

Estoy usando esto cuando estoy usando el directorio de alias str_replace ($ _ SERVER ['SCRIPT_NAME'], '', $ _SERVER ['SCRIPT_FILENAME']) - kiranvj

El problema con SCRIPT_NAME es que no es estático porque se basa en el nombre del script en ejecución actual. Antes de que Apache 2.3.x se adopte popularmente, podemos usar la variable CONTEXT_PREFIX. Me temo que no hay solución. - devXen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.