Как включить файл вне корня документа? - PullRequest
17 голосов
/ 03 марта 2010

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

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.

ОБНОВЛЕНИЕ2: Я также изменил разрешения на 777 в своем тестовом файле и дважды проверил пути к файлу включения в 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>

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

Ответы [ 7 ]

9 голосов
/ 09 марта 2010

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

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

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

2 голосов
/ 13 марта 2010

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

ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com");
require "filename.php";
2 голосов
/ 03 марта 2010

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

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

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

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

1 голос
/ 13 марта 2010

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

0 голосов
/ 08 марта 2010

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

// test.php
<?php
   echo 'Hello World';
?>

// your file
require_once('test.php');

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

0 голосов
/ 08 марта 2010

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

0 голосов
/ 08 марта 2010

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

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

также убедитесь, что .htaccess имеет параметр followsymlink, установленный в true

как насчет того, чтобы попробовать это в вашем file2.php в domain2?

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

...