Как ограничить PHP-приложения своими собственными каталогами и их собственным php.ini?

Я запускаю несколько приложений PHP на своем Mac, работает под управлением OS X 10.5.6, Apache 2, PHP 5. У меня есть настройка субдоменов для каждого проекта, записи файла хоста для каждого субдомена и блоки Virtual Directory в конфигурации Apache. Так

project1.localhost переходит в / Library / WebServer / Documents / Project1
project2.localhost переходит в / Library / WebServer / Documents / Project2
и т.д…

Однако этот метод действительно не «изолирует» веб-приложения. Например, если я включаю такой скрипт:

<?php include("/includes/include.php"); ?> 

Он ссылается на скрипт из базового каталога моего компьютера. Таким образом, он обращается к
C: /includes/include.php

Есть ли способ для меня сделать ссылку
C: /Library/WebServer/Documents/Project2/includes/include.php

В принципе, сделайте так, чтобы он не знал ничего за пределами своего собственного каталога. Кроме того, есть ли способ использовать php.ini на основе поддомена?

Я считаю, что можно установить php.ini для виртуального хоста

 <VirtualHost *:80> ... PHPINIDir /full/path/to/php/ini/ </VirtualHost> 

таким образом вы можете настроить open_basedir и другие

Вы можете ограничить способность скриптов видеть что-либо выше определенного дерева папок, добавив директиву open_basedir в папку httpd.conf. Он должен выглядеть так:

<DIRECTORY / полный / путь / в / папка / содержащий / script />

php_admin_value open_basedir "/ full / path / to / top / folder / of / wish / tree /"

</ Directory>

Одно дело – если вы не закончите путь с помощью a /, то это подстановочный знак. Другими словами, «/ var / etc / my» будет соответствовать «/ var / etc / myFolder», а также «/ var / etc / myMothersFolder», в то время как «/ var / etc / my /» будет соответствовать только этой точной папке имя.

Что касается изоляции приложения ~ это касается обеспечения PHP-скриптов, чтобы они не могли получить доступ к другим? Пожалуйста, дополните –

Что касается php.ini – я не знаю, как использовать конкретный php.ini для каждого каталога, но вы могли бы создать страницу с php include с пучком строк ini_set (), возможно, что-то вроде этого.

 <?php // in your header or along top of all php modules in your pap require_once ( '/path/to/includes/ini_set.php' ); // ... ?> 

и скрипт ini_set.php:

 <?php // one of these for each override of defaults set in php.ini file -- ini_set ( $varname, $newvalue ); ini_set ( $varname, $newvalue ); ini_set ( $varname, $newvalue ); ?> 

Если вам интересно узнать больше о функции ini_set (), вот страница документации на php.net: http://us3.php.net/ini_set

Надеюсь, это было несколько полезно ~

Лучший способ сделать это – использовать PHP через FCGI (mod_fcgid). Таким образом, вы можете запускать PHP с использованием другого пользователя и другого php.ini для vHost.

Вот пример того, как настроить такую ​​конфигурацию на Ubuntu: http://www.howtoforge.com/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-ubuntu-8.10

Если вы хотите использовать полное имя пути, вы можете использовать следующее:

 <?php include dirname( __FILE__ ) . '/includes/include.php'; ?> 

Возможное решение для файла php.ini

Попробуйте относительный путь! Подобно:

 <?php include("./includes/include.php"); ?> в <?php include("./includes/include.php"); ?> 

или

 <?php include("includes/include.php"); ?> в <?php include("includes/include.php"); ?>