2010-02-22 15 views
20

Si mi URL es http://www.server.com/myapp/stuff/to/see y mi estructura de directorios en el disco es htdocs/myapp/*, ¿cómo puedo extraer la parte /myapp? Además, ¿qué pasa si no hay una carpeta de aplicaciones y la raíz de la aplicación es solo '/'? ¿Hay una variable predefinida para obtener ese valor?¿Cómo puedo obtener la "raíz de la aplicación" de mi URL desde PHP?

Lo que quiero es una función que pueda recortar /myapp fuera del URI de solicitud, por lo que solo me queda /stuff/to/see. Y, si tuviera que mover la aplicación a la raíz del documento del servidor, haga que determinar que tan bien (para que /stuff/to/see está acabamos de regresar como /stuff/to/see)

Mi estructura de directorios es la siguiente:

application 
    |-config 
    |-config.inc.php 
library 
    |-autoload.class.php 
public 
    |-css 
    |-img 
index.php 

Por lo tanto, de index.php, quiero saber cómo obtener lo que solicité anteriormente.

Respuesta

12

Para la raíz web, no es DOCUMENT_ROOT como se ha señalado en varias respuestas. Para la raíz de la aplicación, no hay forma de que el sistema indique qué carpeta de la aplicación es la carpeta raíz. Deberá configurarlo manualmente.

La mayoría de las aplicaciones definen una raíz de aplicación usando dirname(__FILE__); o una configuración y la almacenan en una constante que está disponible en toda la aplicación.

+0

¿Necesito codificarlo? ? No hay nada que pueda agregar, digamos DOC_ROOT/myapp/index.php, que pueda descubrir programáticamente que esta es la raíz de la aplicación. – scottm

+1

Si estás en /myapp/index.php, 'dirname (__ FILE __)' (= "dame el directorio actual de este archivo") te dará la raíz de la aplicación definitiva.Puedes almacenar eso en una constante y usarlo. –

0

Prueba esto:

echo dirname(__FILE__); 

donde __FILE__ es el nombre de secuencia de comandos de ejecución actual, y dirname obtiene carpeta carpeta/aplicación fuera de él.

Más opciones:

echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir 

On PHP.net

1

$_SERVER['DOCUMENT_ROOT'] le dará el camino a htdocs, entonces puede ir desde allí

EDITAR

$_SERVER['REQUEST_URI'] siempre le dará /myapp/stuff/to/see desde la URL de muestra anterior, independientemente de la ubicación de los archivos en el disco o desde qué archivo se invoca.

por lo que solo es una cuestión de explode ing, array_shift ing, y implode ing.

Por cierto, desde su estructura de directorios, parece que está usando un marco. algunos marcos tienen una biblioteca URI/URL que puede encontrar útil (al menos CodeIgniter tiene, no está 100% seguro con otros frameworks)

15

Cuando accede a una página usando http://www.server.com/myapp/stuff/to/see, y la raíz del documento de su servidor web está en /something/htdocs/, entonces La ruta actual local es /something/htdocs/myapp/stuff/to/see.

Como resultado, ahora no hay una solución definitiva para obtener /something/htdocs/myapp/, porque no hay una definición clara que ruta de acceso debería obtener.Cuando usted tiene alguna regla para que, nos dicen, y nosotros podríamos ser capaces de llegar a algo, pero sin cálculo, los únicos caminos que puede ver son:

  • http://www.server.com/myapp/stuff/to/see
    $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
  • /something/htdocs/myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_FILENAME']
  • /something/htdocs/
    $_SERVER['DOCUMENT_ROOT']
  • /myapp/stuff/to/see
    $_SERVER['REQUEST_URI']
  • /myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_NAME'] y $_SERVER['PHP_SELF']
+0

¿Puedes aclarar qué variables usaste para obtener esos valores? – scottm

+2

Haga un archivo de prueba con ''. Entonces se hace una idea de lo que puede obtener de qué manera :) Pero también he actualizado mi publicación para incluir las variables correctas. – poke

+0

Seguramente sería genial ver un built-in para algo así como la función 'closer()' de jQuery, así podríamos obtener la ruta de la carpeta más cercana al script actual, pasando el nombre de la carpeta –

3
<?php 
define('ABSPATH', dirname(__FILE__)); 

Coloque el siguiente código en un archivo ubicado en la carpeta raíz de su aplicación e inclúyalo en cada carga de página.

Luego, simplemente siempre puede hacer $path = ABSPATH . '/path/to/file.php'; independientemente de si su copia local está en un subdirectorio folder o no.


Si su aplicación ya tiene un archivo que se incluye en cada carga de página, sólo tiene que colocar el código anterior en ese archivo y funcionará.

Solo tenga en cuenta que puede que tenga que agregar llamadas adicionales dirname() dependiendo de dónde se encuentre ese archivo. Agregue uno para cada directorio que pase desde la raíz de su aplicación web.

Por ejemplo, si su aplicación Web se encuentra en /webapp/ y su "Include global" se encuentra en /webapp/includes/framework/init.php, a continuación, el código anterior tiene que ser modificado como tal:

define('ABSPATH', dirname(dirname(dirname(__FILE__)))); 

es decir .: 2 dirname() llamadas adicionales debido a dos carpetas adicionales a partir de la raíz webapp (includes/framework)


Aclaración

El código anterior está destinado a estar en un archivo y un archivo solo en su aplicación web. Ese archivo debe incluirse en cada carga de página.

Si ya tiene un archivo que se incluye antes de cualquier proceso (como un archivo de configuración u otro), puede copiar y pegar ese código en ese archivo.

El número de llamadas dirname() depende de la profundidad del archivo que ha copiado y pegado el código en es relativa al directorio raíz de la aplicación web. Para los ejemplos anteriores, suponga que la raíz de su aplicación web está representada por ~.

Si copia y pega mi código en ~/abspath.php, entonces necesita una llamada dirname().

Si copia y pega mi código en ~/includes/abspath.php, entonces necesita dos llamadas dirname().

Si copia y pega mi código en ~/includes/config/abspath.php, entonces necesita tres dirname() llamadas. Ahora digamos que esa es su ubicación final.

En ~/index.php, de hacer lo siguiente:

<?php 
require_once('includes/config/abspath.php'); 

y tiene acceso a ABSPATH.

En ~/dir/someOtherPage.php que hacer lo siguiente:

<?php 
require_once('../includes/config/abspath.php'); 

y tiene acceso a ABSPATH.

Es por esto que digo que si ya tiene un archivo que se incluye en cada carga de la página, su más simple sólo para soltar el código anterior en el mismo. Solo asegúrese de modificar la cantidad de llamadas dirname() en consecuencia. De nuevo, este código debe estar en SÓLO UN ARCHIVO.


Luego se deje que la ruta URL, es una simple cuestión de la eliminación de la DOCUMENT_ROOT DE ABSPATH:

$docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/'); 
define('RELADDR', substr(ABSPATH, strlen($docRoot)); 
0

que incurre un problema similar. Básicamente, en PHP si un archivo 'A.php' usa una ruta relativa para referir un recurso, entonces la ubicación de la ruta actual utilizada como un prefijo para la ruta relativa es del principal php principal debajo del cual se incluye 'A.php'.

Esto no será un problema si A.php es el principal superior o si A.php se encuentra en la misma carpeta que su principal superior. Pero romperá la importación de lo contrario.

La mejor solución que encontré fue hacer la referencia explícitamente absoluta usando DIR (que da la ubicación actual del archivo) y luego ir al referido desde esta ubicación para, p. DIR. "/../ help.php" para referirse a un archivo help.php sentado 1 nivel arriba A.php.

Cuestiones relacionadas