Как установить абсолютный путь include в PHP?

В HTML я могу найти файл, начиная с корневой папки веб-сервера, начиная путь к файлу с помощью «/». Подобно:

/images/some_image.jpg 

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

С PHP я попробовал нечто подобное:

 include("/includes/header.php"); 

… но это не работает.

Я думаю, что эта страница говорит, что я могу установить include_path один раз и после этого, это будет принято. Но я не совсем понимаю синтаксис. Оба примера начинаются с периода, и он говорит:

Используя . в включенном пути допускает относительное включение, поскольку это означает текущий каталог.

Относительные – это именно то, чего я не хочу.

Как я могу убедиться, что все мои включенные указывают на папку root/includes ? (Бонус: что, если я хочу разместить эту папку за пределами общедоступного каталога?)

осветление

Мои файлы разработки в настоящее время обслуживаются XAMPP / Apache. Это влияет на абсолютный путь? (Я пока не уверен, что будет на сервере производства.)

Обновить

Я не знаю, в чем моя проблема. Объект include_path , на который я ссылался выше, был именно тем, что я искал, и синтаксис не слишком запутан. Я просто попробовал, и он отлично работает.

Одна вещь, которая возникает у меня, это то, что некоторые люди, возможно, подумали, что «/ some / path» был «абсолютным путем», поскольку они предполагали, что ОС – это Linux. Этот сервер является Windows, поэтому абсолютный путь должен начинаться с имени диска.

Во всяком случае, проблема решена! 🙂

То, что я делаю, помещает файл config.php в корневой каталог. Этот файл включен всеми файлами PHP в моем проекте. В этом файле config.php я делаю следующее:

 define( 'ROOT_DIR', dirname(__FILE__) ); 

Затем во всех файлах я знаю, какой корень моего проекта и может делать такие вещи

 require_once( ROOT_DIR.'/include/functions.php' ); 

Извините, у вас нет бонусных очков за то, что вы попали за пределы общего каталога;) Это также имеет неприятный побочный эффект, который вам по-прежнему нужен относительный путь для поиска config.php, но это делает остальную часть ваших включений намного проще.

Одна стратегия

Я не знаю, лучший ли это, но это сработало для меня.

 $root = $_SERVER['DOCUMENT_ROOT']; include($root."/path/to/file.php"); 

Параметр include_path работает как $ PATH в unix (аналогичный параметр в Windows тоже). Он содержит несколько имен каталогов, разделенных двоеточиями (:). Когда вы включаете или требуете файл, эти каталоги выполняются по порядку, пока не будет найдено совпадение или не будут найдены все каталоги.

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

 ini_set("include_path", "/your_include_path:".ini_get("include_path")); 

Таким образом, сначала выполняется поиск вашего каталога include, а затем исходного пути поиска (по умолчанию текущий каталог, а затем PEAR). Если у вас нет проблемы с модификацией include_path, то это решение для вас.

В include / require нет ничего, что запрещает вам использовать абсолютный путь. так что ваш пример

 include('/includes/header.php'); 

должен работать нормально. Предполагая, что путь и файл имеют значение corect и имеют правильные разрешения.
(и тем самым позволить вам включать любой файл, который вам нравится, внутри или вне вашего корня документа)

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

Эта директива настраивает, где вы можете включать / требовать ваши файлы, и это может быть вашей проблемой.
Некоторые панели управления (например, plesk) устанавливают эту директиву так же, как и корень документа по умолчанию.

как для '.' синтаксис:

 / home / username / public_html <- абсолютный путь  
 public_html <- относительный путь  
 ./public_html <- тот же путь, что и выше  
 ../username/public_html <- другой относительный путь  

Другой вариант – создать файл в каталоге $_SERVER['DOCUMENT_ROOT'] с определением вашего абсолютного пути.

Например, если ваш каталог $_SERVER['DOCUMENT_ROOT']

 C:\wamp\www\ 

создайте файл (т.е. my_paths.php ), содержащий это

 <?php if(!defined('MY_ABS_PATH')) define('MY_ABS_PATH',$_SERVER['DOCUMENT_ROOT'].'MyProyect/') 

Теперь вам нужно включить только в каждый файл в папке MyProyect этого файла ( my_paths.php ), чтобы вы могли использовать MY_ABS_PATH как абсолютный путь для MyProject.

Не напрямую отвечая на ваш вопрос, а что-то помнить:

Когда вы используете include с allow_url_include в своем iny, будьте осторожны, что при доступе к сеансам из включенных файлов, если из сценария вы включаете один файл, используя абсолютную ссылку на файл, а затем включаете второй файл с вашего локального сервера, используя ссылку на файл url, что они имеют разную область переменных, и один и тот же сеанс не будет отображаться из обоих включенных файлов. Исходный сеанс не будет отображаться из файла, включенного в url.

от: http://us2.php.net/manual/en/function.include.php#84052

эй все … у меня была аналогичная проблема с моей системой cms. Мне нужен жесткий путь для некоторых аспектов безопасности. думайте, что лучший способ – это как написал rob. для быстрого грязного кодирования думаю, что это работает и .. 🙂

 <?php $path = getcwd(); $myfile = "/test.inc.php"; /* 

getcwd () указывает на: / usr / srv / apache / htdocs / myworkingdir (в качестве примера)

 echo ($path.$myfile); would return... /usr/srv/apache/htdocs/myworkingdir/test.inc.php access outside your working directory is not allowed. */ includ_once ($path.$myfile); //some code ?> 

хороший день strtok

Я следую примеру WordPress на этом. Я прохожу и определяю корневой путь, как правило, корень документа, а затем отправляю определение пучка другого пути вместе с этим (по одному для каждого из моих классов. IE: база данных, пользователи, html и т. Д.). Часто я определяю корневой путь вручную вместо того, чтобы полагаться на переменную сервера.

пример


 if ($ _ SERVER ['SERVERNAME'] == "localhost")
 {
     define ("ABS_PATH", "/ path / to / upper / most / directory");  // Руководство
 }
 еще
 {
     define ("ABS_PATH, dirname (__ FILE__));
     // Это определяет путь как каталог содержащего файл, обычно config.php
 }

 // определить другие пути ...

 включают в себя (abs_path "/ mystuff.php".);

Спасибо – это одна из двух ссылок, которые появляются, если вы используете Google для абсолютного пути к php Apache.

Как новичок в промежуточном PHP-разработчике, я не понимал, почему абсолютные пути в системах apache windopws будут c: \ xampp \ htdocs (apache document root – XAMPP по умолчанию) вместо /

таким образом, если в http // localhost / myapp / subfolder1 / subfolder2 / myfile.php я хотел включить файл из http // localhost / myapp

Мне нужно указать его как: include ("c: \ xampp \ htdocs \ myapp \ includeme.php") или включить ("../../ includeme.php")

И НЕ включать ("/ myapp / includeme.php")

Я придумал одну строку кода, чтобы установить в верхней части моего скрипта php, чтобы компенсировать:

 <?php if(!$root) for($i=count(explode("/",$_SERVER["PHP_SELF"]));$i>2;$i--) $root .= "../"; ?> 

В этом здании $ root to bee «../» поднимается в иерархии от места, где находится файл. Всякий раз, когда я хочу включить с абсолютным путем, строка будет:

 <?php include($root."some/include/directory/file.php"); ?> 

Мне это не очень нравится, кажется, это неловкий способ решить эту проблему, но, похоже, он работает независимо от того, какой системный php работает и где находится файл, делая его независимым от системы. Для доступа к файлам за пределами веб-каталога добавьте еще …/ после $root , например $root."../external/file.txt" .