Как включить файл вне корневого документа?

Я хочу сделать это, чтобы включить 'file1.php' из 'domain1' в 'file2.php' в 'domain2'. Поэтому я решил, что я должен сделать что-то вроде этого:

file2.php require_once '/var/www/vhosts/domain1/httpdocs/file1.php'; 

Но это не будет работать по причинам, которые я не могу по-настоящему понять. Так что я сделал, это добавить свой путь к пути include. Что-то вроде:

 file2.php set_include_path(get_include_path() . PATH_SEPARATOR . "/var/www/vhosts/domain1/httpdocs"); require_once 'file1.php'; 

Так что, пожалуйста, дайте мне несколько советов о том, где я делаю неправильно?

благодаря

UPDATE. В любом случае я получаю следующее сообщение об ошибке:

 Fatal error: require() [function.require]: Failed opening required '/var/www/vhosts/domain1/httpdocs/file1.php' (include_path='.:/php/includes:/usr/share/pear/') in /var/www/vhosts/domain2/httpdocs/file2.php on line 4 

Также я пробовал это как с safe_mode On и Off.

UPDATE2: Также я изменил разрешения на 777 в своем тестовом файле, и я дважды проверил пути к include-файлу в bash.

РЕШЕНИЕ: Мне удалось решить загадку! Моя хостинговая компания использует Plesk для управления доменами и т. Д. Также уровень сообщений об ошибках в php.ini не был E_ALL. Когда я установил сообщение об ошибке в E_ALL, я получил предупреждение:

 Warning: require() [function.require]: open_basedir restriction in effect. 

Поэтому я зашел в /var/www/vhosts/domain2/conf/httpd.include и отредактировал путь open_basedir. Обратите внимание, что это не долговечное решение, так как этот файл конфигурации перезаписывается plesk каждый раз при изменении конфигурации домена. Что вам нужно сделать, это отредактировать (или создать) файл «vhost.conf» в том же каталоге, а затем запустить:

  /usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=DOMAIN.TLD 

Это должно изменить настройки вашего домена, но по какой-то странной причине он не будет работать с open_basedir. Я могу изменить другие вещи, такие как document_root, но это не изменит open_basedir, но это еще одна проблема: D

РЕШЕНИЕ ЗАКЛЮЧИТЕЛЬНО: для тех, у кого такая же проблема, вот последний код, который сработал. Я просто добавил это в /var/www/vhosts/domain2/conf/vhost.conf (вы можете изменить «/ var / www / vhosts» на «/» или все, что вам нравится):

  <Directory /var/www/vhosts/DOMAIN.TLD/httpdocs> <IfModule mod_php5.c> php_admin_flag engine on php_admin_flag safe_mode off php_admin_value open_basedir "/var/www/vhosts" </IfModule> Options -Includes -ExecCGI </Directory> 

Спасибо всем, ребята!

Вы не можете этого сделать, если действует open_basedir , что препятствует переходу PHP из домашнего каталога.

Вы можете сделать так, чтобы docroot1 и docroot2 принадлежали пользователям одной группы, задавали групповые разрешения и использовали символическую ссылку от docroot2 до docroot1 для чтения другого веб-корня.

Или перестройте PHP и позвольте ему просто следовать типичным разрешениям nix как любой другой процесс 🙂

Вы можете включать файлы из любого места, если хотите, если не разрешены разрешения вашего PHP-скрипта или безопасный режим . Ваш первый подход совершенно прекрасен. Какие ошибки вы получаете?

Повторите комментарии, которые, похоже, подтверждают, что нет доступа из PHP к файлу, который определенно существует. Что касается того, что это могло быть, Сухосин был исключен, единственное, что я могу придумать, это PHP или Apache, являющийся своего рода aa chroot Jail :

Основным преимуществом тюрьмы chroot является то, что тюрьма ограничит часть файловой системы, которую демон может видеть в корневой папке тюрьмы. Кроме того, поскольку тюрьма должна поддерживать Apache, программы, доступные в тюрьме, могут быть крайне ограниченными. Самое главное, что нет необходимости в программах setuid-root, которые могут быть использованы для получения доступа root и выхода из тюрьмы.

Я никогда не работал с чем-то подобным, поэтому я не могу сказать вам, как его обнаружить (помимо создания glob() on /var/www/vhosts и посмотреть, что происходит. Но я думаю, что это должно было быть установлено администратор. Кто управляет вашей машиной?

Это работает на нескольких машинах, которыми я управляю

 ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com"); require "filename.php"; 

Я сижу здесь, задаваясь вопросом, почему вы не сделали символическую ссылку. Или я что-то сделал? Вы могли бы символизировать папку с необходимыми включениями в путь, к которому у вас есть доступ.

Попробуйте chmod 777 в тестовом php-файле, чтобы узнать, работает ли это, если у вас есть проблемы с разрешением. Также сделайте простой phpinfo () и посмотрите, включен ли режим сохранения.

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

Попробуйте создать символическую ссылку file1.php и включите ее, как если бы она была из локального каталога.

также убедитесь, что .htaccess имеет опцию nextymlink, установленную в true

как пробовать это в файле file2.php в домене2?

require_once '../../../domain1/httpdocs/file1.php';

Что произойдет, если вы попробуете потребовать другой файл:

 // test.php <?php echo 'Hello World'; ?> // your file require_once('test.php'); 

Это работает? Если да, поместите test.php в другое место и повторите попытку. Он все еще работает?