Подтвердить что ты не робот

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

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

/images/some_image.jpg

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

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

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

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

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

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

Относительные включения - это именно то, что я не хочу.

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

Разъяснение

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

Update

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

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

В любом случае проблема решена!:)

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Однако такое поведение считается потенциальной угрозой безопасности. Поэтому системный администратор может установить директиву 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().

Ответ 5

Другой вариант - создать файл в каталоге $_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.

Ответ 6

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

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

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

Ответ 7

Привет всем... У меня была аналогичная проблема с моей системой 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

Ответ 8

Я следую примеру 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");

Ответ 9

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

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

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

Мне нужно будет указать его как: включают в себя ( "C:\XAMPP\HTDOCS\MyApp\includeme.php" ) или включают в себя ( "../../includeme.php" )

И НЕ включают в себя ( "/MyApp/includeme.php" )

Ответ 10

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

<?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".