Я хочу сделать это, чтобы включить '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 в другое место и повторите попытку. Он все еще работает?