Como faço para incluir um arquivo em 2 diretórios de volta?

93

Como você inclui um arquivo com mais de 2 diretórios de volta. Eu sei que você pode usar ../index.phppara incluir um arquivo com 2 diretórios de volta, mas como você faz isso para 3 diretórios de volta? Isso faz sentido? Eu tentei, .../index.phpmas não está funcionando.

Eu tenho um arquivo /game/forum/files/index.phpe ele usa PHP include para incluir um arquivo. Que está localizado em /includes/boot.inc.php; /sendo o diretório raiz.

hakre
fonte
1
é mais parecido com PHP, não HTML ...
kender
chdir ('' ../ '');
maheshmnj

Respostas:

152

..seleciona o diretório pai do atual. Claro, isso pode ser encadeado:

../../index.php

Isso seria dois diretórios acima.

Konrad Rudolph
fonte
1
@Brian Bem, isso é um absurdo, você está comparando maçãs e laranjas. Você está certo que um defineseria usado aqui, mas (1) essa não era nem remotamente a questão aqui. E (2) você ainda usaria um caminho relativo em seu define, a menos que você realmente codifique todo o caminho absoluto do servidor e eu me absteria disso, uma vez que tem apenas desvantagens. Ou (a terceira alternativa) você poderia usar a manipulação de strings para extrair o diretório pai do caminho atual (expandido), mas mais uma vez isso não tem nenhuma vantagem em usar caminhos relativos.
Konrad Rudolph de
Infelizmente, isso pode funcionar em um dispositivo e não em outro, /../pode funcionar ou ../pode funcionar, ou nenhum dos dois pode funcionar em três computadores diferentes com exatamente a mesma configuração de ambiente
Douglas Gaskell
@DouglasGaskell Não, está incorreto. A notação de caminho relativo, incluindo ../e ../../(nota: sem barra inicial!), Funciona em todos os sistemas operacionais modernos. É usado para não funcionar em Windows e ( muito tempo atrás) Macintosh mas agora trabalha em todos os lugares, e tem, pelo menos nos últimos anos dez. Se não funcionar em algum lugar, o motivo é que a estrutura do arquivo é diferente e / ou você está em um diretório de trabalho diferente. Mas não está relacionado a este código.
Konrad Rudolph
Konrad, menciono isso porque acabei de lidar com esse problema há menos de 10 minutos, depois de compartilhar um repositório com um colega de trabalho, usando um instantâneo de VM. Por alguma razão, todos os caminhos deveriam ter em /../vez de ../em seu ambiente.
Douglas Gaskell
@DouglasGaskell E posso dizer com segurança que o erro não está relacionado. Na verdade, o caminho /../simplesmente não faz sentido em nenhum sistema (é equivalente a /, ou um erro). Tem certeza de que não está colando nada na frente dele?
Konrad Rudolph
51

Para incluir um arquivo em um diretório anterior, use '../file'. Para dois diretórios de volta, use '../../file'. E assim por diante.

Embora, realisticamente, você não deva realizar inclusões em relação ao diretório atual. E se você quisesse mover esse arquivo? Todos os links seriam quebrados. Uma forma de garantir que você ainda possa vincular a outros arquivos, enquanto mantém esses links se mover o arquivo, é:

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

DOCUMENT_ROOT é uma variável de servidor que representa o diretório base no qual seu código está localizado.

Dan Hulton
fonte
2
Ei, Dan, pergunta rápida: você diz " realisticamente, você não deveria estar executando includes em relação ao diretório atual ". E quanto a todos os caminhos relativos que estão espalhados pela maioria dos documentos HTML? Se eu movesse meu arquivo, eles não quebrariam também? Existe um padrão de quando usar links relativos e absolutos? Agradeço antecipadamente!
Govind Rai
2
acho que está faltando uma barra, deveria ser: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ diretório / diretório / arquivo');
user889030
@ user889030 até onde eu sei, essa barra não é necessária, pelo menos na maioria dos casos
BotMaster3000
1
@ BotMaster3000 hmmm: sandbox.onlinephpfunctions.com/code/…
user889030
27
. = current directory
.. = parent directory

Assim, ../você recebe um diretório de volta, não dois .

Corrente ../quantas vezes forem necessárias para subir 2 ou mais níveis.

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

é sua melhor aposta aqui e evitará a maioria dos bugs de caminho relativo que você pode encontrar com outras soluções.

Na verdade, isso forçará a inclusão a ser sempre relativa à posição do script atual onde esse código está colocado (cujo local é mais provavelmente estável, já que você define a arquitetura de seu aplicativo). Isso é diferente de apenas fazer o include '../../index.php' que incluirá relativamente ao script em execução (também denominado "chamando") e, em seguida, relativamente ao diretório de trabalho atual , que apontará para o script pai que inclui seu script, em vez de resolver a partir do caminho do script incluído .

Da documentação do PHP:

Os arquivos são incluídos com base no caminho do arquivo fornecido ou, se nenhum for fornecido, o include_path especificado. Se o arquivo não for encontrado no include_path, o include irá finalmente verificar o próprio diretório do script de chamada e o diretório de trabalho atual antes de falhar.

E a postagem mais antiga que encontrei citando esse truque data de 2003, de Tapken .

Você pode testar com a seguinte configuração:

Crie um layout como este:

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

Em parent.php, coloque:

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

Em sub/included.php, coloque:

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

Resultado ao acessar parent.php:

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

Como podemos ver, no primeiro caso, o caminho é resolvido a partir do script de chamada parent.php, enquanto usando o dirname(__FILE__).'/path'truque, a inclusão é feita a partir do script included.phponde o código está colocado.

Cuidado, o seguinte NÃO é equivalente ao truque acima, ao contrário do que pode ser lido em outro lugar:

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

Na verdade, prefixar /funcionará, mas resolverá exatamente como include ../../index.phpno script de chamada (a diferença é que include_pathnão será verificado depois se falhar). Do documento PHP :

Se um caminho for definido - seja absoluto (começando com uma letra de unidade ou \ no Windows, ou / em sistemas Unix / Linux) ou relativo ao diretório atual (começando com. Ou ..) - o include_path será totalmente ignorado.

gostoso
fonte
@diEcho: posso saber por que "está completamente errado"? Estou usando em várias aplicações de níveis profissionais e este método é realmente o único que funcionou em todas as situações. Também está detalhado no manual do php : não pode estar tão errado.
gaborous
a primeira linha está completamente errada. Você não pode adicionar ..meio do caminho (relativo / absoluto).
diEcho
@diEcho Devo também indicar o manual do PHP: php.net/manual/en/function.include.php
gaborous
diga-me um único exemplo, onde ..é usado no meio do include. sempre deve ser a primeira parte de include
diEcho
github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Um módulo de nível profissional para um ERP / CRM de nível profissional. Você, senhor, não deve falar quando não sabe o que diz.
gaborous
16

../é um diretório, Repita para dois ../../ou até três diretórios : ../../../e assim por diante.

Definir constantes pode reduzir a confusão porque você irá detalhar os diretórios versos para trás

Você pode definir algumas constantes como:

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

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

Ao usar 'BD' ou meu 'diretório base' parece assim:

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

definir(); referência

Brian Dillingham
fonte
15
../../index.php 

       

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

Cada instância de ../significa subir / voltar um diretório.

alho-poró
fonte
9

a seguir estão as maneiras de acessar seus diferentes diretórios: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
user2951753
fonte
7

Você pode fazer ../../directory/file.txt- Isso vai dois diretórios para trás.

../../../- isso vai três. etc

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

         

MazarD
fonte
6

Mas tenha MUITO cuidado ao permitir que o usuário selecione o arquivo. Você realmente não deseja permitir que eles obtenham um arquivo chamado, por exemplo,

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

ou outros arquivos de sistema sensíveis.

(Desculpe, já faz um tempo desde que eu era um administrador de sistema Linux, e acho que este é um arquivo sensível, pelo que me lembro)

ZombieSheep
fonte
5
../../../includes/boot.inc.php
HAXEN
fonte
4

se você estiver usando php7, você pode usar a função dirname com o parâmetro de nível 2, por exemplo:

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

o segundo parâmetro "2" indica quantos níveis acima

dirname referance

Ron
fonte
3

incluindo diretórios pode ser processado por arquivo proxy

  • raiz
  • ..... | __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';
Allenn
fonte
2

Experimente ../../. Você pode modificá-lo de acordo, pois ele retornará dois diretórios. Primeiro acesse o diretório raiz e, em seguida, acesse o diretório necessário.

Por exemplo, você está dentro root/inc/usr/ape há outro diretório root/2nd/path. Você pode acessar o pathdiretório apdesta forma: ../../2nd/pathprimeiro vá para a raiz do diretório desejado. Se não estiver funcionando, por favor, compartilhe.


fonte
2

se você incluir /no início da inclusão, a inclusão será considerada como o caminho da raiz do site.

se o seu site for http://www.example.com/game/forum/files/index.php, você pode adicionar uma inclusão a /includes/boot.inc.php que resultaria em http://www.example.com /includes/boot.inc.php .

Você deve ter cuidado com o ..traversal, pois alguns servidores web o têm desativado; também causa problemas quando você deseja mover seu site para uma nova máquina / host e a estrutura é um pouco diferente.

Mauro
fonte
2

Tente isto

este exemplo é um diretório de volta

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

este exemplo é dois diretórios de volta

require_once('../../images/yourimg.png');
Rajpoot Rehan
fonte
É exatamente o mesmo ;-) Acho que você quer dizer '../../images/yourimg.png' no segundo?
Edwin
opps, é meu erro
rajpoot rehan
1

Eu vi suas respostas e usei incluir caminho com sintaxe

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

e o servidor http (Apache 2.4.3) retornou o erro interno 500.

Quando mudei o caminho para

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

tudo está bem.

Bronek
fonte