Jak dołączyć plik zawierający więcej niż 2 katalogi wstecz. Wiem, że możesz użyć ../index.php
pliku, który zawiera 2 katalogi z powrotem, ale jak to zrobić dla 3 katalogów wstecz? Czy to ma sens? Próbowałem, .../index.php
ale to nie działa.
Mam plik /game/forum/files/index.php
i używa PHP do dołączenia pliku. Który znajduje się w /includes/boot.inc.php
; /
będący katalogiem głównym.
php
include
filesystems
hakre
źródło
źródło
Odpowiedzi:
..
wybiera katalog nadrzędny z bieżącego. Oczywiście można to połączyć:To byłoby dwa katalogi wyżej.
źródło
define
że zostanie tutaj użyte, ale (1) to nawet nie było tutaj pytaniem. I (2) nadaldefine
uż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./../
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../
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./../
zamiast../
w jego otoczeniu./../
po prostu nie ma sensu w żadnym systemie (jest równoważna/
lub błąd). Czy na pewno nie wklejasz czegoś przed nim?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.źródło
. = 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ę.źródło
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:
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
: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, wincluded.php
któ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 winclude ../../index.php
przypadku 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 :źródło
..
środka ścieżki (względna / bezwzględna)...
jest używany środek dołączenia. zawsze powinna to być pierwsza część włączania../
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
źródło
źródło
Każda instancja
../
oznacza przewijanie do jednego katalogu.źródło
Oto sposoby dostępu do różnych katalogów: -
./ = Your current directory ../ = One directory lower ../../ = Two directories lower ../../../ = Three directories lower
źródło
Możesz to zrobić
../../directory/file.txt
- w ten sposób cofniesz się o dwa katalogi.../../../
- to idzie trzy. itpźródło
źródło
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,
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)
źródło
źródło
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
źródło
Polecam użyć
__DIR__
do określenia aktualnego katalogu plików php . Sprawdź tutaj powód.__DIR__ . /../../index.php
źródło
w tym ponad katalogi mogą być przetwarzane przez plik proxy
..... | _proxy.php
dbsettings.php: $host='localhost'; $user='username': $pass='pass'; proxy.php: include_once 'db/dbsettings.php requiredDbSettings.php: include_once './../proxy.php';
źródło
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');
źródło
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/ap
i jest inny katalogroot/2nd/path
. Możesz uzyskać dostęp dopath
katalogu wap
ten sposób:../../2nd/path
najpierw przejdź do katalogu głównego, niż do żądanego katalogu. Jeśli nie działa, udostępnij.źródło
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.źródło
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.
źródło