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


Что я хочу сделать, так это включить'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>

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

Author: Brayn, 2010-03-03

7 answers

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

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

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

 9
Author: Tim Post, 2015-08-16 02:44:16

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

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

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

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

 2
Author: Pekka 웃, 2010-03-08 19:20:27

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

ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com");
require "filename.php";
 2
Author: Kristoffer Sall-Storgaard, 2010-03-13 18:22:19

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

 1
Author: naugtur, 2010-03-13 16:08:59

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

 0
Author: douwe, 2010-03-08 10:21:55

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

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

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

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

Требуется_once '../../../domain1/httpdocs/file1.php ';

 0
Author: coder, 2010-03-08 15:34:31

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

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

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

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

 0
Author: Chuck Burgess, 2010-03-08 19:12:57