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