Jak dołączyć plik do 2 katalogów z powrotem?

96

Jak dołączyć plik zawierający więcej niż 2 katalogi wstecz. Wiem, że możesz użyć ../index.phppliku, który zawiera 2 katalogi z powrotem, ale jak to zrobić dla 3 katalogów wstecz? Czy to ma sens? Próbowałem, .../index.phpale to nie działa.

Mam plik /game/forum/files/index.phpi używa PHP do dołączenia pliku. Który znajduje się w /includes/boot.inc.php; /będący katalogiem głównym.

hakre
źródło
chdir ('' ../ '');
maheshmnj

Odpowiedzi:

154

..wybiera katalog nadrzędny z bieżącego. Oczywiście można to połączyć:

../../index.php

To byłoby dwa katalogi wyżej.

Konrad Rudolph
źródło
1
@Brian Cóż, to nonsens, porównujesz jabłka i pomarańcze. Masz rację, defineże zostanie tutaj użyte, ale (1) to nawet nie było tutaj pytaniem. I (2) nadal defineużywałbyś ścieżki względnej w swoim , chyba że faktycznie zakodowałbyś całą bezwzględną ścieżkę serwera i powstrzymałbym się od tego, ponieważ ma tylko wady. Lub (trzecia alternatywa) możesz użyć manipulacji na ciągach znaków, aby wyodrębnić katalog nadrzędny z (rozwiniętej) bieżącej ścieżki, ale po raz kolejny nie ma to żadnych zalet w użyciu ścieżek względnych.
Konrad Rudolph,
Niestety może to działać na jednym urządzeniu, a nie na innym, /../może działać lub ../może działać, lub żaden z nich nie może działać na trzech różnych komputerach z dokładnie taką samą konfiguracją środowiska
Douglas Gaskell
@DouglasGaskell Nie, to nieprawda. Notacja ścieżki względnej, w tym ../i ../../(uwaga: bez wiodącego ukośnika!), Działa we wszystkich nowoczesnych systemach operacyjnych. Jest używany do nie działać w systemie Windows i ( długo temu) Macintosh ale teraz działa wszędzie, i ma co najmniej przez ostatnie dziesięć lat. Jeśli gdzieś to nie działa, przyczyną jest to, że struktura plików jest inna i / lub znajdujesz się w innym katalogu roboczym. Ale to nie ma związku z tym kodem.
Konrad Rudolph
Konradzie, wspominam o tym, ponieważ zajmowałem się tym problemem niecałe 10 minut temu po udostępnieniu repozytorium współpracownikowi, używając migawki maszyny wirtualnej. Z jakiegoś powodu wszystkie ścieżki musiały mieć /../zamiast ../w jego otoczeniu.
Douglas Gaskell
@DouglasGaskell I mogę z całą pewnością powiedzieć, że błąd nie ma związku. W rzeczywistości ścieżka /../po prostu nie ma sensu w żadnym systemie (jest równoważna /lub błąd). Czy na pewno nie wklejasz czegoś przed nim?
Konrad Rudolph
51

Aby dołączyć plik o jeden katalog z powrotem, użyj '../file'. W przypadku dwóch katalogów wstecz użyj '../../file'. I tak dalej.

Chociaż realistycznie nie powinieneś wykonywać dołączeń względem bieżącego katalogu. A co by było, gdybyś chciał przenieść ten plik? Wszystkie linki zostaną zerwane. Aby upewnić się, że nadal możesz tworzyć łącza do innych plików, zachowując te łącza w przypadku przenoszenia pliku, jest:

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

DOCUMENT_ROOT jest zmienną serwera, która reprezentuje katalog podstawowy, w którym znajduje się kod.

Dan Hulton
źródło
2
Hej Dan, krótkie pytanie: mówisz „ realistycznie nie powinieneś wykonywać dołączeń względem bieżącego katalogu ”. A co ze wszystkimi względnymi ścieżkami, które są zaśmiecone w większości dokumentów HTML? Gdybym przeniósł plik, czy to również nie pękło? Czy istnieje standard, kiedy należy używać linków względnych, a kiedy bezwzględnych? Z góry dziękuję!
Govind Rai
2
myślę, że brakuje jednego ukośnika, powinien to być: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
user889030
@ user889030 o ile wiem, ten slash nie jest potrzebny, przynajmniej w większości przypadków
BotMaster3000
1
@ BotMaster3000 hmmm: sandbox.onlinephpfunctions.com/code/…
user889030
28
. = current directory
.. = parent directory

Więc ../dostajesz jeden katalog z powrotem, a nie dwa .

Łańcuch ../tyle razy, ile potrzeba, aby przejść o 2 lub więcej poziomów w górę.

Joe Skora
źródło
21
include dirname(__FILE__).'/../../index.php';

jest tutaj najlepszym rozwiązaniem i pozwoli uniknąć większości błędów związanych ze ścieżkami względnymi, które można napotkać w przypadku innych rozwiązań.

Rzeczywiście, spowoduje to, że dołączanie będzie zawsze zależne od pozycji bieżącego skryptu, w którym ten kod jest umieszczony (która lokalizacja jest najprawdopodobniej stabilna, ponieważ definiujesz architekturę aplikacji). Różni się to od zwykłego robienia, include '../../index.php' które obejmuje wykonywany (nazywany również „wywołującym”) skrypt, a następnie względem bieżącego katalogu roboczego , który będzie wskazywał na skrypt nadrzędny, który zawiera twój skrypt, zamiast rozwiązywania ze ścieżki dołączonego skryptu .

Z dokumentacji PHP:

Pliki są dołączane na podstawie podanej ścieżki do pliku lub, jeśli jej nie podano, określonej ścieżki include_path. Jeśli plik nie zostanie znaleziony w ścieżce include_path, funkcja include w końcu sprawdzi własny katalog skryptu wywołującego i bieżący katalog roboczy przed niepowodzeniem.

Najstarszy post, w którym znalazłem cytowanie tej sztuczki, pochodzi z 2003 roku autorstwa Tapkena .

Możesz przetestować za pomocą następującej konfiguracji:

Utwórz układ taki jak ten:

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

W parent.php, włóż:

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

W sub/included.php, włóż:

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

Wynik podczas uzyskiwania dostępu parent.php:

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

Jak widzimy, w pierwszym przypadku ścieżka jest rozwiązywana ze skryptu wywołującego parent.php, podczas gdy za pomocą dirname(__FILE__).'/path'sztuczki włączanie odbywa się ze skryptu, w included.phpktórym znajduje się kod.

Uwaga, poniższy tekst NIE jest odpowiednikiem powyższej sztuczki w przeciwieństwie do tego, co można przeczytać gdzie indziej:

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

Rzeczywiście, prepending /zadziała, ale rozwiąże to tak samo, jak w include ../../index.phpprzypadku skryptu wywołującego (różnica polega na tym, include_pathże nie będzie później obsługiwana, jeśli się nie powiedzie). Z dokumentu PHP :

Jeśli zdefiniowano ścieżkę - niezależnie od tego, czy jest to bezwzględna (zaczynająca się od litery dysku lub \ w systemie Windows lub / w systemach Unix / Linux), czy względna w stosunku do bieżącego katalogu (zaczynająca się od. Lub ..) - ścieżka include_path zostanie całkowicie zignorowana.

wytworny
źródło
@diEcho: czy mogę wiedzieć, dlaczego jest „całkowicie źle”? Używam go w kilku profesjonalnych aplikacjach i ta metoda jest właściwie jedyną, która działała w każdej sytuacji. Jest to również szczegółowo opisane w podręczniku php : nie może być tak źle.
gaborous
pierwsza linia jest całkowicie błędna. Nie możesz dodać ..środka ścieżki (względna / bezwzględna).
diEcho
@diEcho Powinienem również wskazać podręcznik PHP: php.net/manual/en/function.include.php
gaborous
powiedz mi pojedynczy przykład, gdzie ..jest używany środek dołączenia. zawsze powinna to być pierwsza część włączania
diEcho
github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Profesjonalny moduł dla profesjonalnego ERP / CRM. Nie powinieneś, panie, mówić, kiedy nie wiesz, co mówisz.
gaborous
16

../to jeden katalog, Powtórz to dla dwóch ../../lub nawet trzech katalogów : ../../../i tak dalej.

Definiowanie stałych może zmniejszyć zamieszanie, ponieważ będziesz drążyć do przodu w katalogach wersety wstecz

Możesz zdefiniować takie stałe:

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

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

Podczas korzystania z 'BD' lub mojego 'katalogu podstawowego' wygląda to tak:

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

definiować(); odniesienie

Brian Dillingham
źródło
15
../../index.php 

       

bdukes
źródło
12
../../../includes/boot.inc.php

Każda instancja ../oznacza przewijanie do jednego katalogu.

por
źródło
9

Oto sposoby dostępu do różnych katalogów: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
user2951753
źródło
7

Możesz to zrobić ../../directory/file.txt- w ten sposób cofniesz się o dwa katalogi.

../../../- to idzie trzy. itp

Ólafur Waage
źródło
7
../../../index.php

         

MazarD
źródło
6

Ale bądź BARDZO ostrożny, pozwalając użytkownikowi wybrać plik. Naprawdę nie chcesz pozwolić im na pobranie pliku o nazwie, na przykład,

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

lub inne wrażliwe pliki systemowe.

(Przepraszam, minęło trochę czasu, odkąd byłem administratorem systemu Linux i myślę, że to poufny plik, z tego, co pamiętam)

ZombieSheep
źródło
5
../../../includes/boot.inc.php
HAXEN
źródło
5

jeśli używasz php7, możesz użyć funkcji dirname z parametrem poziomu 2, na przykład:

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

Drugi parametr „2” wskazuje, o ile awansujesz

dirname referance

ron
źródło
3

w tym ponad katalogi mogą być przetwarzane przez plik proxy

  • korzeń
  • ..... | __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
źródło
3

Spróbuj tego

ten przykład to jeden katalog wstecz

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

ten przykład to dwa katalogi wstecz

require_once('../../images/yourimg.png');
rajpoot rehan
źródło
Dokładnie tak samo ;-) Myślę, że na drugim masz na myśli „../../images/yourimg.png”?
Edwin
opps to mój błąd
rajpoot rehan
2

Próbować ../../ . Możesz go odpowiednio zmodyfikować, ponieważ spowoduje to przejście do dwóch katalogów. Najpierw przejdź do katalogu głównego, a następnie przejdź do wymaganego katalogu.

Np. Jesteś w root/inc/usr/api jest inny katalog root/2nd/path. Możesz uzyskać dostęp do pathkatalogu w apten sposób: ../../2nd/pathnajpierw przejdź do katalogu głównego, niż do żądanego katalogu. Jeśli nie działa, udostępnij.

chan
źródło
2

jeśli umieścisz /na początku dołączania, zostanie ono przyjęte jako ścieżka z katalogu głównego witryny.

jeśli twoja witryna to http://www.example.com/game/forum/files/index.php , możesz dodać dołączenie do /includes/boot.inc.php, które rozwiąże się do http://www.example.com /includes/boot.inc.php .

Musisz uważać na ..przemierzanie, ponieważ niektóre serwery internetowe mają to wyłączone; powoduje również problemy, gdy chcesz przenieść witrynę na nowy komputer / hosta, a struktura jest trochę inna.

Mauro
źródło
1

Widziałem twoje odpowiedzi i użyłem ścieżki zawierającej składnię

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

a serwer http (Apache 2.4.3) zwrócił błąd wewnętrzny 500.

Kiedy zmieniłem ścieżkę do

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

wszystko w porządku.

Bronek
źródło