Как включить файл вне корневого каталога документа?
Что я хочу сделать, так это включить'file1.php 'из 'домена 1' в'file2.php "в "домене 2". Поэтому я решил, что мне следует сделать что-то вроде этого:
file2.php
require_once '/var/www/vhosts/domain1/httpdocs/file1.php';
Но это не сработает по причинам, которые я не могу по-настоящему понять. Итак, что я сделал, так это добавил свой путь к включенному пути. Что-то вроде:
file2.php
set_include_path(get_include_path() . PATH_SEPARATOR . "/var/www/vhosts/domain1/httpdocs");
require_once 'file1.php';
Так что не могли бы вы, пожалуйста, дать мне несколько советов о том, где я делаю неправильно?
Спасибо
ОБНОВЛЕНИЕ - В любом случае я получаю следующее сообщение об ошибке:
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.
UPDATE2: Также я изменил разрешения на 777 в своем тестовом файле и дважды проверил пути к включаемому файлу в bash.
РЕШЕНИЕ: Мне удалось разгадать тайну! Моя хостинговая компания использует Plesk для управления доменами и тому подобным. Также уровень отчетов об ошибках в php.ini не был E_ALL. Когда я установил сообщение об ошибках в E_ALL, я получил предупреждение:
Warning: require() [function.require]: open_basedir restriction in effect.
Поэтому я зашел в /var/www/vhosts/домен2/conf/httpd.включить и отредактировал путь 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>
Спасибо вам всем, ребята!
7 answers
Вы не сможете этого сделать, если open_basedir
действует, что предотвращает выход PHP из домашнего каталога.
Что вы можете сделать, так это убедиться, что docroot1 и docroot2 принадлежат пользователям одной группы, соответствующим образом установить разрешения группы и использовать символическую ссылку с docroot2 на docroot1 для чтения другого корневого веб-сайта.
Или перестройте PHP и позвольте ему просто следовать типичным разрешениям *nix, как и любому другому процессу:)
Вы можете включать файлы из любого места, где хотите, если только разрешения вашего PHP-скрипта или безопасный режим предотвратите это. Ваш первый подход совершенно хорош. Какие ошибки вы получаете?
Комментарии, которые, похоже, подтверждают, что из PHP нет доступа к файлу, который определенно существует. Что касается того, что это может быть, Сухосин был исключен, единственное, о чем я могу думать, это то, что PHP или Apache являются чем-то вроде корень Тюрьма:
Основное преимущество тюрьмы chroot заключается в том, что тюрьма ограничивает доступную демону часть файловой системы корневым каталогом тюрьмы. Кроме того, поскольку тюрьма должна поддерживать только Apache, программы, доступные в тюрьме, могут быть крайне ограничены. Самое главное, что нет необходимости в программах setuid-root, которые можно использовать для получения корневого доступа и выхода из тюрьмы.
Я никогда не работал ни с чем подобным, поэтому я не могу сказать вам, как это определить (кроме как сделать glob()
на /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 для параметра followsymlink установлено значение true
Как насчет того, чтобы попробовать это в своем file2.php в домене 2?
Требуется_once '../../../domain1/httpdocs/file1.php ';
Что произойдет, если вы попытаетесь запросить другой файл:
// test.php
<?php
echo 'Hello World';
?>
// your file
require_once('test.php');
Это работает? Если да, то поставьте test.php в другом месте и повторите попытку. Это все еще работает?