Как включить файл, который больше 2 каталогов назад. Я знаю, что вы можете использовать ../index.php
для включения файла, который находится на 2 директории назад, но как вы это сделаете для 3 директорий назад? Имеет ли это смысл? Я пробовал, .../index.php
но не работает.
У меня есть файл, /game/forum/files/index.php
и он использует включение PHP для включения файла. Который находится в /includes/boot.inc.php
; /
является корневым каталогом.
php
include
filesystems
hakre
источник
источник
Ответы:
..
выбирает родительский каталог из текущего. Конечно, это можно связать:Это было бы двумя каталогами вверх.
источник
define
будет использоваться a , но (1) это даже отдаленно не вопрос. И (2) вы все равно будете использовать относительный путь в своемdefine
, если только вы не жестко закодируете весь абсолютный путь к серверу, и я бы воздержался от этого, поскольку он имеет только недостатки. Или (третий вариант) вы можете использовать манипуляции со строками для извлечения родительского каталога из (расширенного) текущего пути, но, опять же, это не имеет никаких преимуществ при использовании относительных путей./../
может работать или../
может работать, или ни один из них не может работать на трех разных компьютерах с одной и той же настройкой среды../
и../../
(примечание: без косой черты в начале!), Работает во всех современных операционных системах. Он используется для не работать на Windows , и ( долго назад) Macintosh , но теперь он работает везде, и имеет , по крайней мере , за последние десять лет. Если это где-то не работает, причина в том, что файловая структура отличается, и / или вы находитесь в другом рабочем каталоге. Но это не связано с этим кодом./../
вместо../
его окружения./../
просто не имеет смысла в любой системе (это эквивалентно/
ошибке). Вы уверены, что не вставляете что-то перед ним?Чтобы включить файл на один каталог назад, используйте
'../file'
. Для возврата на два каталога используйте'../../file'
. И так далее.Хотя, на самом деле, вы не должны выполнять включения относительно текущего каталога. Что, если вы захотите переместить этот файл? Все ссылки разорвутся. Способ гарантировать, что вы все еще можете ссылаться на другие файлы, сохраняя при этом эти ссылки, если вы перемещаете файл, заключается в следующем:
require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');
DOCUMENT_ROOT
- это серверная переменная, представляющая базовый каталог, в котором находится ваш код.источник
. = current directory .. = parent directory
Так
../
вы получите один каталог обратно, а не два .Цепи
../
столько раз, сколько необходимо, чтобы подняться на 2 или более уровней.источник
include dirname(__FILE__).'/../../index.php';
это ваш лучший выбор, и он позволит избежать большинства ошибок относительного пути, с которыми вы можете столкнуться с другими решениями.
В самом деле, это заставит включение всегда относиться к положению текущего скрипта, в котором размещен этот код (это положение, скорее всего, стабильно, поскольку вы определяете архитектуру своего приложения). Это отличается от простого выполнения,
include '../../index.php'
которое будет включать относительно выполняемого (также называемого «вызывающим») скрипта, а затем относительно текущего рабочего каталога. , который будет указывать на родительский скрипт, который включает ваш скрипт, вместо разрешения из вашего пути включенного скрипта .Из документации PHP:
И самый старый пост, который я нашел, цитируя этот трюк, датируется 2003 годом, авторством Tapken .
Вы можете протестировать со следующей настройкой:
Создайте такой макет:
htdocs ¦ parent.php ¦ goal.php ¦ +---sub ¦ included.php ¦ goal.php
В
parent.php
, говоря:<?php include dirname(__FILE__).'/sub/included.php'; ?>
В
sub/included.php
, говоря:<?php print("WRONG : " . realpath('goal.php')); print("GOOD : " . realpath(dirname(__FILE__).'/goal.php')); ?>
Результат при доступе
parent.php
:Как мы видим, в первом случае путь разрешается из вызывающего скрипта
parent.php
, в то время как с помощью этойdirname(__FILE__).'/path'
уловки включение выполняется из скрипта,included.php
в который помещен код.Остерегайтесь, следующее НЕ эквивалентно описанному выше трюку, вопреки тому, что можно прочитать в другом месте:
include '/../../index.php';
Действительно, предварительное добавление
/
будет работать, но оно будет разрешено так же, как иinclude ../../index.php
в вызывающем скрипте (разница в том, что вinclude_path
случае сбоя последующие действия не будут выполняться).Из документа PHP :источник
..
середину пути (относительный / абсолютный)...
используется середина включения. это всегда должна быть первая часть include../
- это один каталог, повторите для двух../../
или даже трех каталогов :../../../
и так далее.Определение констант может уменьшить путаницу, потому что вы будете углубляться в каталоги стихами назад
Вы можете определить некоторые константы так:
define('BD', '/home/user/public_html/example/'); define('HTMLBD', 'http://example.com/');
При использовании 'BD' или моего 'базового каталога' это выглядит так:
file(BD.'location/of/file.php');
определить (); Справка
источник
источник
Каждый экземпляр
../
означает переход на один каталог вверх / назад.источник
Ниже приведены способы доступа к вашим различным каталогам: -
./ = Your current directory ../ = One directory lower ../../ = Two directories lower ../../../ = Three directories lower
источник
Вы можете сделать
../../directory/file.txt
- Это возвращает на два каталога назад.../../../
- это три. так далееисточник
источник
Но будьте ОЧЕНЬ осторожны, позволяя пользователю выбирать файл. Вы действительно не хотите позволять им получать файл с именем, например,
или другие важные системные файлы.
(Извините, я давно не был системным администратором Linux, и я думаю, что это конфиденциальный файл, насколько я помню)
источник
источник
если вы используете php7, вы можете использовать функцию dirname с параметром уровня 2, например:
dirname("/usr/local/lib", 2);
второй параметр «2» указывает на сколько уровней вверх
dirname referance
источник
Я рекомендую использовать
__DIR__
для указания текущего каталога файлов php . Проверьте здесь по причине.__DIR__ . /../../index.php
источник
в том числе над каталогами может обрабатываться прокси-файлом
..... | _proxy.php
dbsettings.php: $host='localhost'; $user='username': $pass='pass'; proxy.php: include_once 'db/dbsettings.php requiredDbSettings.php: include_once './../proxy.php';
источник
Попробуй это
этот пример - один каталог назад
require_once('../images/yourimg.png');
этот пример - два каталога назад
require_once('../../images/yourimg.png');
источник
Попробуй
../../
. Вы можете изменить его соответствующим образом, так как он вернет вас назад на два каталога. Сначала перейдите в корневой каталог, затем перейдите в нужный каталог.Например, вы находитесь в
root/inc/usr/ap
другом каталогеroot/2nd/path
. Вы можете получить доступ кpath
каталогуap
следующим образом:../../2nd/path
сначала перейдите в корневой каталог, чем в нужный каталог. Если не работает, поделитесь.источник
если вы включите
/
в начало включения, это будет путь от корня сайта.если ваш сайт http://www.example.com/game/forum/files/index.php, вы можете добавить включение в /includes/boot.inc.php, которое будет преобразовано в http://www.example.com /includes/boot.inc.php .
Вы должны быть осторожны с
..
обходом, так как некоторые веб-серверы отключили его; это также вызывает проблемы, когда вы хотите переместить свой сайт на новый компьютер / хост, а структура немного отличается.источник
Я видел ваши ответы и использовал путь включения с синтаксисом
require_once '../file.php'; // server internal error 500
а http-сервер (Apache 2.4.3) вернул внутреннюю ошибку 500.
Когда я изменил путь на
require_once '/../file.php'; // OK
Все отлично.
источник