Как обратиться к public_html корневому файлу, используя include, после того, как вы перейдете к одной файловой директории из public_html

Основываясь на некоторых исключительно полезных советах, я использую следующий код для включения файлов PHP вне моего корневого каталога, который выглядит примерно так:

 define('WEB_ROOT', __DIR__); define('APP_ROOT', dirname(__DIR__)); define('PHP_ROOT', APP_ROOT . DIRECTORY_SEPARATOR . 'application'); include(PHP_ROOT . DIRECTORY_SEPARATOR . 'bootstrap.php'); 

Мой вопрос в том, что, скажем, например, вы включаете код bootstrap.php в соответствии с тем, что у вас есть выше.

Что делать, если в этом загрузочном файле PHP файла была своя строка кода, в которую включен файл BACK в корневой папке public_html …. как бы это сделать? Мне сложно это сделать, моя цель здесь в том, что я не хочу полностью заполнять фактические литералы в коде, и я хочу избежать атак с обходами файлов

Рассмотрим эту структуру проекта:

 /path/to/projectroot/index.php
                      header.php
                      включить / inc.php

Если index.php

 include('include/inc.php'); 

и inc.php имели

 include('header.php'); 

Вы получите эту ошибку, так как строка в inc.php будет искать

 /path/to/projectroot/include/header.php (не существует)

не

 /path/to/projectroot/header.php (существует)

Есть несколько способов решить это.

1: Абсолютные пути

Первым и самым простым является использование абсолютных путей.

Если index.php

 include('include/inc.php'); 

и inc.php имели

 include('/path/to/projectroot/header.php'); 

Это сработает.

2: Абсолютные пути с определениями

Аналогично # 1, если index.php был

 define('PROJECT_ROOT', '/path/to/projectroot/'); include(PROJECT_ROOT.'include/inc.php'); 

и inc.php имели

 include(PROJECT_ROOT.'header.php'); 

Это сработает.

Обновление. Как отмечено в комментариях pichan , вы можете использовать одну из «магических» констант здесь, в index.php, поэтому:

index.php

 define('PROJECT_ROOT', __DIR__.'/'); include(PROJECT_ROOT.'include/inc.php'); 

и inc.php

 include(PROJECT_ROOT.'header.php'); 

Обратите внимание, что мы добавляем конечную косую черту в __DIR__ здесь, поскольку:

Это имя каталога не имеет завершающей косой черты, если это не корневая директория.

3: включить и скрыть ошибки

Если бы inc.php

 @include('header.php'); # Try this directory @include('../header.php'); # Try parent directory 

Это будет работать. [1]

4: Предположим, что текущий каталог, если не указано иное

Если index.php

 $rel_prefix_to_root = '../'; include('include/inc.php'); 

и inc.php имели

 if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; } include($rel_path_to_root . 'header.php'); 

Это сработает.

Я беру на себя эти методы

1 и 2 в основном одинаковы, но 2 немного проще и более распространен для больших проектов, поскольку он позволяет вам сделать одно постоянное определение и использовать его на всей территории. Он также позволяет развертывать проект на нескольких серверах (размещается на нескольких путях) и требует изменения одной линии по всему проекту, а не одной строки в каждом файле для варианта 1.

3 ужасно, не делай этого. Иногда вы увидите это, вы можете даже увидеть его в учебниках онлайн. Не делай этого.

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

Некоторые примечания:

[1] Это ужасная идея. Он работает, но не делайте этого.

Чтобы получить каталог выше public_html, я использую следующие
$ aboveRoot = explode ('/ public_html', $ _SERVER ['DOCUMENT_ROOT']);
define ('ABOVE_THE_ROOT', $ aboveRoot [0]);