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

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

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

chdir ('' ../ '');

maheshmnj 20.03.2019 11:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
99
1
287 674
19

Ответы 19

../../index.php 

       

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

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

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

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

../../index.php

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

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

Konrad Rudolph 20.08.2012 13:24

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

Douglas Gaskell 04.10.2017 20:23

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

Konrad Rudolph 04.10.2017 20:31

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

Douglas Gaskell 04.10.2017 21:07

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

Konrad Rudolph 04.10.2017 21:59

../../../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-документов? Если бы я переместил свой файл, не сломались бы они? Есть ли стандарт, когда использовать относительные и абсолютные ссылки? Заранее спасибо!

Govind Rai 10.11.2016 04:21

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

user889030 06.12.2017 21:46

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

BotMaster3000 18.01.2018 15:36

@ BotMaster3000 хммм: sandbox.onlinephpfunctions.com/code/…

user889030 24.01.2018 07:54

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

если ваш сайт 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: это не может быть так неправильно.

gaborous 26.10.2012 02:50

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

diEcho 26.10.2012 08:17

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

gaborous 27.10.2012 02:03

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

diEcho 29.10.2012 08:21
github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… A professional-grade module for a professional-grade ERP/CRM. You, sir, should not talk when you shan't know what you say.
gaborous 29.10.2012 20:18

@diEcho: также вы должны знать, что каждое включение автоматически разрешается, начиная с PHP 4.peanuts, аналогично тому, как это делает realpath ().

gaborous 29.10.2012 20:22

сначала я тоже подумал, что @gaborous ошибается, но я попробовал! :-) Оно работает! И, как я думаю, это должен быть принятый ответ, так как это очень поможет в работе на местном уровне и без проблем :-) спасибо gaborous

Arun Shankar 29.01.2016 20:47

@DevTest Пожалуйста, извините меня за несколько гневных комментариев выше.

gaborous 30.01.2016 16:49

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

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

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

  • корень
  • ..... | __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';
    

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

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

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

dirname referance

Я рекомендую использовать __DIR__ для указания текущий каталог файлов php. Проверьте причину в здесь.

__DIR__ . /../../index.php

Попробуй это

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

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

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

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

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

Edwin 03.04.2019 10:31

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

rajpoot rehan 03.04.2019 15:20

Другие вопросы по теме