Как мне установить абсолютный путь включения в PHP? - PullRequest
40 голосов
/ 05 декабря 2008

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

/images/some_image.jpg

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

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

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

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

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

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

Относительное включает в себя именно то, что я не хочу.

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

Разъяснение

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

Обновление

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

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

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

Ответы [ 10 ]

45 голосов
/ 05 декабря 2008

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

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

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

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

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

24 голосов
/ 05 декабря 2008

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

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

$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/path/to/file.php");
8 голосов
/ 05 декабря 2008

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

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

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

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

3 голосов
/ 05 декабря 2008

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

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

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

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

2 голосов
/ 21 августа 2013

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

0 голосов
/ 08 августа 2012

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

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

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

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

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

0 голосов
/ 29 апреля 2010

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

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

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

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

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

0 голосов
/ 25 июля 2009

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

* ** 1003 тысяча два * Пример

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");

0 голосов
/ 05 декабря 2008

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

0 голосов
/ 05 декабря 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...