В HTML я могу найти файл, начинающийся с корневой папки веб-сервера, начав путь к файлу с «/». Нравиться:
/images/some_image.jpg
Я могу поместить этот путь в любой файл в любом подкаталоге, и он будет указывать на правильное изображение.
С PHP я пробовал нечто подобное:
include("/includes/header.php");
... но это не работает.
Я думаю, что эта страница говорит, что я могу установить include_path один раз, и после этого это будет принято. Но я не совсем понимаю синтаксис. Оба примера начинаются с точки и говорят:
Using a . in the include path allows for relative includes as it means the current directory.
Относительные включения - это именно то, что мне нужно не.
Как мне убедиться, что все мои включения указывают на папку root/includes? (Бонус: что, если я захочу поместить эту папку вне общедоступного каталога?)
Мои файлы разработки в настоящее время обслуживаются XAMPP / Apache. Это влияет на абсолютный путь? (Я еще не уверен, какой будет производственный сервер.)
Я не знаю, в чем была моя проблема. include_path, о котором я упоминал выше, был именно тем, что я искал, и синтаксис на самом деле не сбивает. Я просто попробовал, и он отлично работает.
Мне приходит в голову одна вещь: некоторые люди могли подумать, что «/ some / path» был «абсолютным путем», потому что они предполагали, что ОС - это Linux. Это сервер Windows, поэтому абсолютный путь должен начинаться с имени диска.
В любом случае проблема решена! :)
Я начинаю думать, что не понимаю, что вы подразумеваете под абсолютным путем.
Jacco: под абсолютным путем я подразумеваю «путь, начинающийся от корня веб-сервера, а не от того места, где используется код». Также НЕ "запуск с жесткого диска". Я хочу иметь возможность без изменений переместить код на другой сервер.
Большинство людей назвали бы это «корнем документа». Имейте в виду, что $ _SERVER ['DOCUMENT_ROOT'] не всегда доступен.
@Jacco - когда $ _SERVER ['DOCUMENT_ROOT'] будет недоступен?
@NathanLong Примером может служить вызов файла php из командной строки, в этом случае массив $_SERVER будет пустым






Что я делаю, так это помещаю файл config.php в свой корневой каталог. Этот файл включен во все файлы PHP в моем проекте. Затем в этом файле config.php я делаю следующее:
define( 'ROOT_DIR', dirname(__FILE__) );
Тогда во всех файлах я знаю, что такое корень моего проекта, и могу делать такие вещи, как это
require_once( ROOT_DIR.'/include/functions.php' );
Извините, никаких бонусных очков за выход за пределы общедоступного каталога;) Это также имеет неприятный побочный эффект: вам по-прежнему нужен относительный путь для поиска config.php, но это значительно упрощает остальные ваши включения.
Вот как я почти всегда это вижу. По крайней мере, для основных включений.
Но как вы выполняете первоначальное включение config.php? Вы просто знаете, где это?
Да, как я сказал в конце своего сообщения, у него есть недостаток, заключающийся в необходимости использовать относительный путь ('../../config.php') для его поиска, что затрудняет рефакторинг вашего кода или перемещение файлов. . Это означает, что вам нужно поддерживать только одно из своих включений, чтобы упростить задачу.
Простая альтернатива dirname(__FILE__) - __DIR__.
Параметр include_path работает как $ PATH в unix (аналогичный параметр есть и в Windows). Он содержит несколько имен каталогов, разделенных двоеточиями (:). Когда вы включаете или запрашиваете файл, поиск в этих каталогах выполняется по порядку, пока не будет найдено совпадение или пока не будет выполнен поиск во всех каталогах.
Итак, чтобы убедиться, что ваше приложение всегда включает из вашего пути, если файл там существует, просто поместите ваш include dir первым в списке каталогов.
ini_set("include_path", "/your_include_path:".ini_get("include_path"));
Таким образом, сначала выполняется поиск в вашем подключаемом каталоге, а затем по исходному пути поиска (по умолчанию текущий каталог, а затем PEAR). Если у вас нет проблем с изменением include_path, то это решение для вас.
Да! Я только что обнаружил это и пришел сюда, чтобы опубликовать это, а потом заметил ваш ответ. Извини, я позволил этому так долго томиться. :) Документация: php.net/manual/en/ini.core.php#ini.include-path
PS - самый простой способ установить это, если вы управляете сервером, находится в php.ini. Но тогда вы не можете перетащить свой код на другой компьютер и ожидать, что он будет работать, не выполнив этот шаг настройки, и, возможно, ваш веб-хост не позволит вам.
Не отвечу прямо на ваш вопрос, но кое-что нужно запомнить:
When using includes with allow_url_include on in your ini beware that, when accessing sessions from included files, if from a script you include one file using an absolute file reference and then include a second file from on your local server using a url file reference that they have different variable scope and the same session will not be seen from both included files. The original session won't be seen from the url included file.
В включают / требовать нет ничего, что запрещало бы вам использовать абсолютный путь. так что твой пример
include('/includes/header.php');
должно работать нормально. Предполагается, что путь и файл являются corect и для них установлены правильные разрешения. (и тем самым позволяет вам включать любой файл, который вам нравится, в корень вашего документа или за его пределами)
Однако такое поведение считается возможным риском для безопасности. Следовательно, системный администратор может установить директиву open_basedir.
Эта директива настраивает, где вы можете включать / требовать свои файлы, и это может быть вашей проблемой. Некоторые панели управления (например, plesk) по умолчанию устанавливают эту директиву такой же, как корень документа.
что касается синтаксиса '.':
/home/username/public_html <- absolute path public_html <- relative path ./public_html <- same as the path above ../username/public_html <- another relative path
Однако обычно я использую немного другой вариант:
require_once(__DIR__ . '/Factories/ViewFactory.php');
В этом выпуске вы указываете абсолютный путь относительно файла, содержащего инструкцию require_once().
Привет всем ... у меня была аналогичная проблема с моей системой cms. Мне нужен был трудный путь для некоторых аспектов безопасности. Думаю, лучший способ - это как написал Роб. для быстрого грязного кодирования думаю, это тоже работает .. :-)
<?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
доступ за пределами вашего рабочего каталога разрешен без ограничений open_basedir
да, но скажите это моему провайдеру :)) я боролся с ним за отключение safe_mode ... после нескольких недель обсуждений .. он сделал это ..
Не знаю, лучший ли это способ, но у меня он сработал.
$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/path/to/file.php");
ты великолепен!! Я пробовал очень много других вещей, и это отлично сработало. Спасибо:)
Это решение, которое я использовал, и оно отлично сработало! Престижность
В этом я следую примеру Wordpress. Я иду и определяю корневой путь, обычно это корень документа, а затем определяю кучу других путей вместе с ним (по одному для каждого из моих каталогов классов. IE: база данных, пользователи, html и т. д.). Часто я определяю корневой путь вручную, вместо того, чтобы полагаться на переменную сервера.
Пример
if ($_SERVER['SERVERNAME'] == "localhost")
{
define("ABS_PATH", "/path/to/upper/most/directory"); // Manual
}
else
{
define("ABS_PATH, dirname(__FILE__));
// This defines the path as the directory of the containing file, normally a config.php
}
// define other paths...
include(ABS_PATH."/mystuff.php");
Черт возьми, я не понимал, сколько лет этому вопросу.
Спасибо - это одна из 2 ссылок, которые появляются, если вы используете Google для абсолютного пути php apache windows.
Как новичок в PHP-разработчике, я не понимал, почему абсолютные пути в системах apache windopws будут c: \ xampp \ htdocs (корень документа apache - по умолчанию XAMPP) вместо /
таким образом, если в http // localhost / myapp / subfolder1 / subfolder2 / myfile.php я хотел бы включить файл из http // localhost / myapp
Мне нужно было бы указать это как: include ("c: \ xampp \ htdocs \ myapp \ includeme.php") или же include ("../../ 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".
Другой вариант - создать файл в каталоге $_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.
Пожалуйста, объясните, что означает «... но это не работает».