Как включить файл, который больше 2 каталогов назад. Я знаю, что вы можете использовать ../index.php для включения файла с двумя каталогами обратно, но как это сделать с тремя каталогами?
Имеет ли это смысл?
Я пробовал .../index.php, но он не работает.
У меня есть файл в /game/forum/files/index.php, и он использует включение PHP для включения файла. Который находится в /includes/boot.inc.php; / является корневым каталогом.






../../index.php
Вы можете сделать ../../directory/file.txt - это возвращает на два каталога назад.
../../../ - это три. так далее
../../../includes/boot.inc.php
.. выбирает родительский каталог из текущего. Конечно, это можно связать:
../../index.php
Это было бы двумя каталогами вверх.
@Brian Ну, это чепуха, ты сравниваешь яблоки и апельсины. Вы правы, что здесь будет использоваться define, но (1) это даже отдаленно не вопрос. И (2) вы по-прежнему будете использовать относительный путь в define, если только вы не запрограммируете весь абсолютный путь к серверу, и я бы воздержался от этого, поскольку он имеет только недостатки. Или (третий вариант) вы можете использовать манипуляции со строками для извлечения родительского каталога из (расширенного) текущего пути, но, опять же, это не дает преимуществ Любые по сравнению с использованием относительных путей.
К сожалению, это может работать на одном устройстве, а не на другом, /../ может работать или ../, или ни один из них не может работать на трех разных компьютерах с одной и той же настройкой среды.
@DouglasGaskell Нет, это неправильно. Обозначение относительного пути, включая ../ и ../../ (примечание: ведущая косая черта нет!), Работает во всех современных операционных системах. привыкший не работает в Windows и (длинная назад) Macintosh, но теперь он работает везде, и работает по крайней мере последние десять лет. Если где-то не работает, то причина в другой файловой структуре и / или вы находитесь в другом рабочем каталоге. Но это не связано с этим кодом.
Конрад, я упоминаю об этом, так как я только что рассмотрел эту проблему не более 10 минут назад после того, как поделился репозиторием с коллегой, используя моментальный снимок виртуальной машины. По какой-то причине на всех путях в его среде должен был быть /../ вместо ../.
@DouglasGaskell И я могу с уверенностью сказать вам, что ошибка не связана. Фактически, путь /../ просто не имеет смысла в любой системе (это эквивалент / или ошибка). Ты уверен, что ты не оклейка что-то перед ним?
../../../index.php
../../../includes/boot.inc.php
Каждый экземпляр ../ означает один каталог вверх / назад.
. = current directory
.. = parent directory
Итак, ../ дает вам один каталог назад, а не два.
Подключите ../ столько раз, сколько необходимо, чтобы подняться на 2 или более уровней.
Но будьте осторожны с ОЧЕНЬ, позволяя пользователю выбирать файл. Вы действительно не хотите позволять им получать файл с именем, например,
../../../../../../../../../../etc/passwd
или другие важные системные файлы.
(Извините, я давно не был системным администратором Linux, и я считать, это конфиденциальный файл, насколько я помню)
Чтобы включить файл на один каталог назад, используйте '../file'.
Для двух каталогов назад используйте '../../file'.
И так далее.
Хотя на самом деле вам не следует выполнять включения относительно текущего каталога. Что, если вы захотите переместить этот файл? Все ссылки разорвутся. Способ гарантировать, что вы по-прежнему можете ссылаться на другие файлы, сохраняя при этом эти ссылки, если вы перемещаете файл, заключается в следующем:
require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');
DOCUMENT_ROOT - это серверная переменная, представляющая базовый каталог, в котором находится ваш код.
Привет, Дэн, быстрый вопрос: ты говоришь "реально вы не должны выполнять включения относительно текущего каталога". А как насчет всех относительных путей, которые встречаются в большинстве HTML-документов? Если бы я переместил свой файл, не сломались бы они? Есть ли стандарт, когда использовать относительные и абсолютные ссылки? Заранее спасибо!
я думаю, что отсутствует одна косая черта, это должно быть: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
@ user889030, насколько мне известно, косая черта не нужна, по крайней мере, в большинстве случаев
@ BotMaster3000 хммм: sandbox.onlinephpfunctions.com/code/…
если вы включите / в начале включения, это будет путь от корня сайта.
если ваш сайт http://www.example.com/game/forum/files/index.php, вы можете добавить include в /includes/boot.inc.php, которое будет разрешено в http://www.example.com/includes/boot.inc.php.
Вы должны быть осторожны с обходом .., так как некоторые веб-серверы отключили его; это также вызывает проблемы, когда вы хотите переместить свой сайт на новый компьютер / хост, а структура немного отличается.
../ - это один каталог, повторите для двух каталогов ../../ или даже трех: ../../../ и так далее.
Определение констант может уменьшить путаницу, потому что вы будете углубляться в каталоги стихами назад
Вы можете определить некоторые константы так:
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 '../../index.php'который будет включать относительно исполняемого (также называемого "вызывающим") скрипта, а затем относительно текущего рабочего каталога, который будет указывать на родительский сценарий, который включает ваш сценарий, вместо разрешения из пути вашего включенного сценария.
Из документации PHP:
Files are included based on the file path given or, if none is given, the include_path specified. If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing.
И самый старый пост, который я нашел, цитирующий этот трюк восходит к 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' включение выполняется из скрипта included.php, в который помещается код.
Остерегайтесь, следующее НЕ эквивалентно описанному выше трюку, вопреки тому, что можно прочитать в другом месте:
include '/../../index.php';
Действительно, добавление / будет работать, но оно будет разрешено так же, как include ../../index.php из вызывающего сценария (разница в том, что include_path не будет обрабатываться впоследствии, если он не удастся). Из документа PHP:
If a path is defined — whether absolute (starting with a drive letter or \ on Windows, or / on Unix/Linux systems) or relative to the current directory (starting with . or ..) — the include_path will be ignored altogether.
@diEcho: могу я узнать, почему это «совершенно неправильно»? Я использую его в нескольких приложениях профессионального уровня, и этот метод фактически единственный, который работал в любой ситуации. Это также подробно описано в руководство по php: это не может быть так неправильно.
первая строка совершенно неверна. Нельзя добавлять .. в середину пути (относительный / абсолютный).
@diEcho Я также должен указать вам на руководство по PHP: php.net/manual/en/function.include.php
скажите мне один пример, где .. используется в середине включения. это всегда должно быть первой частью include
@diEcho: также вы должны знать, что каждое включение автоматически разрешается, начиная с PHP 4.peanuts, аналогично тому, как это делает realpath ().
сначала я тоже подумал, что @gaborous ошибается, но я попробовал! :-) Оно работает! И, как я думаю, это должен быть принятый ответ, так как это очень поможет в работе на местном уровне и без проблем :-) спасибо gaborous
@DevTest Пожалуйста, извините меня за несколько гневных комментариев выше.
Я видел ваши ответы и использовал путь включения с синтаксисом
require_once '../file.php'; // server internal error 500
а http-сервер (Apache 2.4.3) вернул внутреннюю ошибку 500.
Когда я изменил путь на
require_once '/../file.php'; // OK
все хорошо.
Попробуйте ../../. Вы можете изменить его соответствующим образом, так как он вернет вас назад на два каталога. Сначала перейдите в корневой каталог, затем войдите в требуемый каталог.
Например. Вы находитесь в root/inc/usr/ap, а есть еще один каталог root/2nd/path. Вы можете получить доступ к каталогу path из ap следующим образом:
../../2nd/path сначала перейдите в корневой каталог, чем в желаемый каталог. Если не работает, поделитесь.
Ниже приведены способы доступа к вашим различным каталогам: -
./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
в том числе над каталогами может обрабатываться прокси-файлом
..... | _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» указывает на сколько уровней вверх
Я рекомендую использовать __DIR__ для указания текущий каталог файлов php. Проверьте причину в здесь.
__DIR__ . /../../index.php
Попробуй это
этот пример - одна директория назад
require_once('../images/yourimg.png');
этот пример - два каталога назад
require_once('../../images/yourimg.png');
Точно так же ;-) Думаю, вы имеете в виду "../../images/yourimg.png" на втором?
против моей ошибки
chdir ('' ../ '');