Как мне включить файл в 2 каталога обратно?


96

Как включить файл, который больше 2 каталогов назад. Я знаю, что вы можете использовать ../index.phpдля включения файла, который находится на 2 директории назад, но как вы это сделаете для 3 директорий назад? Имеет ли это смысл? Я пробовал, .../index.phpно не работает.

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


chdir ('' ../ '');
maheshmnj

Ответы:


154

..выбирает родительский каталог из текущего. Конечно, это можно связать:

../../index.php

Это было бы двумя каталогами вверх.


1
@Brian Ну, это чушь, ты сравниваешь яблоки и апельсины. Вы правы, что здесь defineбудет использоваться a , но (1) это даже отдаленно не вопрос. И (2) вы все равно будете использовать относительный путь в своем define, если только вы не жестко закодируете весь абсолютный путь к серверу, и я бы воздержался от этого, поскольку он имеет только недостатки. Или (третий вариант) вы можете использовать манипуляции со строками для извлечения родительского каталога из (расширенного) текущего пути, но, опять же, это не имеет никаких преимуществ при использовании относительных путей.
Конрад Рудольф

К сожалению, это может работать на одном устройстве, а не на другом, /../может работать или ../может работать, или ни один из них не может работать на трех разных компьютерах с одной и той же настройкой среды
Дуглас Гаскелл

@DouglasGaskell Нет, это неправильно. Обозначение относительного пути, включая ../и ../../(примечание: без косой черты в начале!), Работает во всех современных операционных системах. Он используется для не работать на Windows , и ( долго назад) Macintosh , но теперь он работает везде, и имеет , по крайней мере , за последние десять лет. Если это где-то не работает, причина в том, что файловая структура отличается, и / или вы находитесь в другом рабочем каталоге. Но это не связано с этим кодом.
Конрад Рудольф

Конрад, я упоминаю об этом, так как я только что рассмотрел эту проблему не более 10 минут назад после совместного использования репозитория с коллегой с помощью снимка виртуальной машины. По какой-то причине все пути должны были проходить /../вместо ../его окружения.
Дуглас Гаскелл

@DouglasGaskell И я могу с уверенностью сказать вам, что ошибка не связана. Фактически, этот путь /../просто не имеет смысла в любой системе (это эквивалентно /ошибке). Вы уверены, что не вставляете что-то перед ним?
Конрад Рудольф

51

Чтобы включить файл на один каталог назад, используйте '../file'. Для возврата на два каталога используйте '../../file'. И так далее.

Хотя, на самом деле, вы не должны выполнять включения относительно текущего каталога. Что, если вы захотите переместить этот файл? Все ссылки разорвутся. Способ гарантировать, что вы все еще можете ссылаться на другие файлы, сохраняя при этом эти ссылки, если вы перемещаете файл, заключается в следующем:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT - это серверная переменная, представляющая базовый каталог, в котором находится ваш код.


2
Привет, Дэн, быстрый вопрос: вы говорите: «На самом деле вы не должны выполнять включения относительно текущего каталога ». А как насчет всех относительных путей, которые встречаются в большинстве HTML-документов? Если бы я переместил свой файл, не сломались бы они? Есть ли стандарт, когда использовать относительные и абсолютные ссылки? Заранее спасибо!
Говинд Рай

2
я думаю, что отсутствует одна косая черта, это должно быть: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
user889030 06

@ user889030, насколько мне известно, косая черта не нужна, по крайней мере, в большинстве случаев
BotMaster3000


28
. = current directory
.. = parent directory

Так ../вы получите один каталог обратно, а не два .

Цепи ../столько раз, сколько необходимо, чтобы подняться на 2 или более уровней.


21
include dirname(__FILE__).'/../../index.php';

это ваш лучший выбор, и он позволит избежать большинства ошибок относительного пути, с которыми вы можете столкнуться с другими решениями.

В самом деле, это заставит включение всегда относиться к положению текущего скрипта, в котором размещен этот код (это положение, скорее всего, стабильно, поскольку вы определяете архитектуру своего приложения). Это отличается от простого выполнения, include '../../index.php' которое будет включать относительно выполняемого (также называемого «вызывающим») скрипта, а затем относительно текущего рабочего каталога. , который будет указывать на родительский скрипт, который включает ваш скрипт, вместо разрешения из вашего пути включенного скрипта .

Из документации PHP:

Файлы включаются на основе указанного пути к файлу или, если он не указан, указанного include_path. Если файл не найден в include_path, include, наконец, проверит собственный каталог вызывающего сценария и текущий рабочий каталог перед ошибкой.

И самый старый пост, который я нашел, цитируя этот трюк, датируется 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 :

Если путь определен - абсолютный (начиная с буквы диска или \ в Windows, или / в системах Unix / Linux) или относительно текущего каталога (начиная с. Или ..) - include_path будет полностью проигнорирован.


@diEcho: могу я узнать, почему это «совершенно неправильно»? Я использую его в нескольких приложениях профессионального уровня, и этот метод фактически единственный, который работал в любой ситуации. Это также подробно описано в руководстве по php : здесь не может быть ничего плохого.
gaborous

первая строка совершенно неверна. Нельзя добавлять ..середину пути (относительный / абсолютный).
diEcho

@diEcho Я также должен указать вам на руководство по PHP: php.net/manual/en/function.include.php
gaborous

подскажите хоть один пример, где ..используется середина включения. это всегда должна быть первая часть include
diEcho

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Модуль профессионального уровня для ERP / CRM профессионального уровня. Вы, сэр, не должны говорить, если не знаете, что говорите.
gaborous

16

../- это один каталог, повторите для двух ../../или даже трех каталогов : ../../../и так далее.

Определение констант может уменьшить путаницу, потому что вы будете углубляться в каталоги стихами назад

Вы можете определить некоторые константы так:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

При использовании 'BD' или моего 'базового каталога' это выглядит так:

file(BD.'location/of/file.php');

определить (); Справка



12
../../../includes/boot.inc.php

Каждый экземпляр ../означает переход на один каталог вверх / назад.


9

Ниже приведены способы доступа к вашим различным каталогам: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower

7

Вы можете сделать ../../directory/file.txt- Это возвращает на два каталога назад.

../../../- это три. так далее



6

Но будьте ОЧЕНЬ осторожны, позволяя пользователю выбирать файл. Вы действительно не хотите позволять им получать файл с именем, например,

../../../../../../../../../../etc/passwd

или другие важные системные файлы.

(Извините, я давно не был системным администратором Linux, и я думаю, что это конфиденциальный файл, насколько я помню)



5

если вы используете php7, вы можете использовать функцию dirname с параметром уровня 2, например:

dirname("/usr/local/lib", 2);

второй параметр «2» указывает на сколько уровней вверх

dirname referance



3

в том числе над каталогами может обрабатываться прокси-файлом

  • корень
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';
    

3

Попробуй это

этот пример - один каталог назад

require_once('../images/yourimg.png');

этот пример - два каталога назад

require_once('../../images/yourimg.png');

Точно так же ;-) Думаю, вы имеете в виду "../../images/yourimg.png" на втором?
Эдвин

против моей ошибки
rajpoot rehan

2

Попробуй ../../. Вы можете изменить его соответствующим образом, так как он вернет вас назад на два каталога. Сначала перейдите в корневой каталог, затем перейдите в нужный каталог.

Например, вы находитесь в root/inc/usr/apдругом каталоге root/2nd/path. Вы можете получить доступ к pathкаталогу apследующим образом: ../../2nd/pathсначала перейдите в корневой каталог, чем в нужный каталог. Если не работает, поделитесь.


2

если вы включите / в начало включения, это будет путь от корня сайта.

если ваш сайт http://www.example.com/game/forum/files/index.php, вы можете добавить включение в /includes/boot.inc.php, которое будет преобразовано в http://www.example.com /includes/boot.inc.php .

Вы должны быть осторожны с ..обходом, так как некоторые веб-серверы отключили его; это также вызывает проблемы, когда вы хотите переместить свой сайт на новый компьютер / хост, а структура немного отличается.


1

Я видел ваши ответы и использовал путь включения с синтаксисом

require_once '../file.php'; // server internal error 500

а http-сервер (Apache 2.4.3) вернул внутреннюю ошибку 500.

Когда я изменил путь на

require_once '/../file.php'; // OK

Все отлично.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.