Основываясь на некоторых исключительно полезных советах, я использую следующий код для включения файлов 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]);