¿Cómo incluyo un archivo de más de 2 directorios hacia atrás?

94

¿Cómo se incluye un archivo que tiene más de 2 directorios atrás? Sé que puede usar ../index.phppara incluir un archivo que tiene 2 directorios atrás, pero ¿cómo lo hace para 3 directorios atrás? ¿Esto tiene sentido? Lo intenté .../index.phppero no funciona.

Tengo un archivo /game/forum/files/index.phpy usa PHP include para incluir un archivo. Que se encuentra en /includes/boot.inc.php; /siendo el directorio raíz.

hakre
fuente
chdir ('' ../ '');
maheshmnj

Respuestas:

153

..selecciona el directorio padre del actual. Por supuesto, esto se puede encadenar:

../../index.php

Esto sería dos directorios arriba.

Konrad Rudolph
fuente
1
@Brian Bueno, eso es una tontería, estás comparando manzanas y naranjas. Tiene razón en que a definese usaría aquí, pero (1) esa no era ni remotamente la pregunta aquí. Y (2) todavía usaría una ruta relativa en sudefine , a menos que realmente codifique toda la ruta absoluta del servidor y me abstendría de eso ya que solo tiene desventajas. O (la tercera alternativa) podría usar la manipulación de cadenas para extraer el directorio principal de la ruta actual (expandida), pero una vez más, esto no tiene ninguna ventaja en el uso de rutas relativas.
Konrad Rudolph
Lamentablemente, esto puede funcionar en un dispositivo y no en otro, /../puede funcionar o ../puede funcionar, o ninguno puede funcionar en tres computadoras diferentes con la misma configuración de entorno exacta
Douglas Gaskell
@DouglasGaskell No, eso es incorrecto. La notación de la ruta relativa, que incluye ../y ../../(nota: ¡ sin barra inclinada!), Funciona en todos los sistemas operativos modernos. Se utiliza para que no funcione en Windows y ( siempre hace) Macintosh pero ahora trabaja en todas partes, y tiene por lo menos durante los últimos años diez. Si no funciona en algún lugar, entonces la razón es que la estructura del archivo es diferente y / o estás en un directorio de trabajo diferente. Pero no está relacionado con este código.
Konrad Rudolph
Konrad, menciono esto ya que acabo de tratar este problema no hace 10 minutos después de compartir un repositorio con un compañero de trabajo, usando una instantánea de VM. Por alguna razón todos los caminos debían tener en /../lugar de ../en su entorno.
Douglas Gaskell
@DouglasGaskell Y puedo decirles con confianza que el error no está relacionado. De hecho, la ruta /../simplemente no tiene sentido en ningún sistema (es equivalente a /, o es un error). ¿Estás seguro de que no estás pegando algo delante?
Konrad Rudolph
51

Para incluir un archivo en un directorio atrás, use '../file'. Para dos directorios hacia atrás, use '../../file'. Y así.

Aunque, de manera realista, no debería realizar inclusiones relativas al directorio actual. ¿Y si quisiera mover ese archivo? Todos los enlaces se romperían. Una forma de asegurarse de que aún puede vincular a otros archivos, mientras conserva esos vínculos si mueve su archivo, es:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT es una variable de servidor que representa el directorio base en el que se encuentra su código.

Dan Hulton
fuente
2
Hola, Dan, pregunta rápida: dices "de manera realista, no deberías realizar inclusiones relativas al directorio actual ". ¿Qué pasa con todas las rutas relativas que se encuentran en la mayoría de los documentos HTML? Si moviera mi archivo, ¿no se romperían también? ¿Existe un estándar de cuándo usar enlaces relativos o absolutos? ¡Gracias de antemano!
Govind Rai
2
Creo que le falta una barra, debería ser: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directorio / directorio / archivo');
user889030
@ user889030 hasta donde yo sé, esa barra no es necesaria, al menos en la mayoría de los casos
BotMaster3000
1
@ BotMaster3000 hmmm: sandbox.onlinephpfunctions.com/code/…
user889030
27
. = current directory
.. = parent directory

Así ../que le devuelve un directorio, no dos .

Encadena ../tantas veces como sea necesario para subir 2 o más niveles.

Joe Skora
fuente
21
include dirname(__FILE__).'/../../index.php';

es su mejor opción aquí, y evitará la mayoría de los errores de ruta relativos que puede encontrar con otras soluciones.

De hecho, obligará a que la inclusión sea siempre relativa a la posición del script actual donde se coloca este código (qué ubicación es más probable que sea estable, ya que usted define la arquitectura de su aplicación). Esto es diferente de simplemente hacer include '../../index.php' lo que incluirá relativamente al script de ejecución (también llamado "llamando") y luego al directorio de trabajo actual , que apuntará al script principal que incluye su script, en lugar de resolver desde la ruta del script incluido .

De la documentación de PHP:

Los archivos se incluyen en función de la ruta del archivo proporcionada o, si no se proporciona, la ruta_incluida especificada. Si el archivo no se encuentra en include_path, include finalmente verificará el directorio propio del script de llamada y el directorio de trabajo actual antes de fallar.

Y la publicación más antigua que encontré citando este truco se remonta a 2003, por Tapken .

Puede probar con la siguiente configuración:

Crea un diseño como este:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

En parent.php, poner:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

En sub/included.php, poner:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

Resultado al acceder parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

Como podemos ver, en el primer caso, la ruta se resuelve desde el script de llamada parent.php, mientras que al usar el dirname(__FILE__).'/path'truco, la inclusión se realiza desde el script included.phpdonde se coloca el código.

Tenga cuidado, lo siguiente NO es equivalente al truco anterior al contrario de lo que se puede leer en otra parte:

include '/../../index.php';

De hecho, la anteposición /funcionará, pero se resolverá como include ../../index.phpen el script de llamada (la diferencia es que include_pathno se revisará después si falla). Desde PHP doc :

Si se define una ruta, ya sea absoluta (comenzando con una letra de unidad o \ en Windows, o / en sistemas Unix / Linux) o relativa al directorio actual (comenzando con. O ..) - include_path se ignorará por completo.

gaboroso
fuente
@diEcho: ¿puedo saber por qué "está completamente mal"? Lo estoy usando en varias aplicaciones de grado profesional y este método es en realidad el único que funcionó en todas las situaciones. También está detallado en el manual de php : no puede estar tan mal.
gaborous
la primera línea es completamente incorrecta. No se puede agregar la ..mitad de la ruta (relativa / absoluta).
diEcho
@diEcho También debería señalarle el manual de PHP: php.net/manual/en/function.include.php
gaborous
dime un solo ejemplo, donde ..se usa en medio de la inclusión. siempre debe ser la primera parte de include
diEcho
github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Un módulo de nivel profesional para un ERP / CRM de nivel profesional. Usted, señor, no debería hablar cuando no sepa lo que dice.
gaborous
16

../es un directorio, se repite para dos directorios ../../o incluso para tres: ../../../y así sucesivamente.

La definición de constantes puede reducir la confusión porque profundizará en directorios en lugar de hacia atrás.

Podría definir algunas constantes así:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

Al usar 'BD' o mi 'directorio base', se ve así:

file(BD.'location/of/file.php');

definir(); referencia

Brian Dillingham
fuente
15
../../index.php 

       

bdukes
fuente
12
../../../includes/boot.inc.php

Cada instancia de ../significa subir / bajar un directorio.

Puerro
fuente
9

Las siguientes son formas de acceder a sus diferentes directorios: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
usuario2951753
fuente
7

Puede hacerlo ../../directory/file.txt: esto retrocede dos directorios.

../../../- esto va a tres. etc

Ólafur Waage
fuente
7
../../../index.php

         

MazarD
fuente
6

Pero tenga MUCHO cuidado al permitir que un usuario seleccione el archivo. Realmente no desea permitirles obtener un archivo llamado, por ejemplo,

../../../../../../../../../../etc/passwd

u otros archivos sensibles del sistema.

(Lo siento, ha pasado un tiempo desde que era un administrador de sistemas de Linux, y creo que este es un archivo confidencial, por lo que recuerdo)

ZombieOvejas
fuente
5
../../../includes/boot.inc.php
HAXEN
fuente
4

si está usando php7, puede usar la función dirname con el parámetro de nivel 2, por ejemplo:

dirname("/usr/local/lib", 2);

el segundo parámetro "2" indica cuántos suben de nivel

referencia de nombre de directorio

ron
fuente
3

incluyendo más de directorios puede ser procesado por archivo proxy

  • raíz
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';
Allen
fuente
2

Prueba ../../. Puede modificarlo en consecuencia, ya que lo llevará hacia atrás dos directorios. Primero acceda al directorio raíz y luego acceda al directorio requerido.

Por ejemplo, está dentro root/inc/usr/apy hay otro directorio root/2nd/path. Puede acceder al pathdirectorio de apesta manera: ../../2nd/pathprimero vaya a la raíz que el directorio deseado. Si no funciona, compártelo.

kan
fuente
2

si incluye el /al principio de la inclusión, la inclusión se tomará como la ruta desde la raíz del sitio.

si su sitio es http://www.example.com/game/forum/files/index.php , puede agregar una inclusión a /includes/boot.inc.php que se resolvería en http://www.example.com /includes/boot.inc.php .

Debe tener cuidado con el ..cruce ya que algunos servidores web lo tienen deshabilitado; también causa problemas cuando desea mover su sitio a una nueva máquina / host y la estructura es un poco diferente.

Mauro
fuente
2

Prueba esto

este ejemplo es un directorio atrás

require_once('../images/yourimg.png');

este ejemplo es dos directorio atrás

require_once('../../images/yourimg.png');
rajpoot rehan
fuente
Es exactamente lo mismo ;-) Creo que te refieres a '../../images/yourimg.png' en el segundo.
Edwin
opps es mi error
rajpoot rehan
1

Vi tus respuestas y usé incluir ruta con sintaxis

require_once '../file.php'; // server internal error 500

y el servidor http (Apache 2.4.3) devolvió el error interno 500.

Cuando cambié el camino a

require_once '/../file.php'; // OK

todo esta bien.

Bronek
fuente