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