2009-03-12 4 views
6

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

project1.localhost идет в/Library/WebServer/Documents/Проект1
project2.localhost идет в/Library/WebServer/Документы/Проект2
и т.д ...

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

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

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

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

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

ответ

8

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

<VirtualHost *:80> 
    ... 

    PHPINIDir /full/path/to/php/ini/ 

</VirtualHost> 

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

+0

Что вы подразумеваете под «таким образом, вы можете настроить open_basedir и другие». Является ли open_basedir установкой INI? –

+1

Да, и вот почему использование «php_admin_value open_basedir»/path »'также работает –

-1

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

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

или

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

Так что точка делает его идти к DocumentRoot поддоменов? –

+0

А как насчет php.ini? –

+0

"." всегда является текущим каталогом! –

0

Если вы хотите использовать полный путь к файлу, вы можете использовать это:

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

Possible solution for php.ini file

+0

В документации PHP «Если используется внутри include, возвращается имя включенного файла». Так что это тоже не полезно, в том случае, если include включает другие файлы. –

4

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

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

php_admin_value open_basedir «/ полный/путь/к/верхней/папку// желательно/дерево /»

</КАТАЛОГ >

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

+0

Я еще не пытался это сделать, но есть ли какие-либо оговорки с использованием этого метода? –

+0

Предостережения? Как что? С директивой open_basedir или с положением директивы в файле httpd.conf? – user13414

+0

Я не нашел никаких ошибок, которые явно не упоминаются в документах. – user13414

1

Что касается изоляции приложения ~ это касается защиты 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

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

+0

Я думал о работе над несколькими приложениями одновременно и не использовал один и тот же INI для всех из них. Я также хочу иметь возможность легко перемещать приложения в Linux или Windows без необходимости повторного создания всей структуры каталогов, потому что у меня есть абсолютные пути в них. –

+0

Существуют ли проблемы с производительностью при настройке значений PHP INI на загрузку каждой страницы? –

1

Лучший способ сделать это состоит в использовании 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

+0

Я рассмотрю это, если не могу найти другой метод. Благодаря! –