Подтвердить что ты не робот

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

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

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

Спасибо

ОБНОВЛЕНИЕ. В любом случае я получаю следующее сообщение об ошибке:

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 в своем тестовом файле, и я дважды проверил пути к включенному файлу в bash.

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

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

Итак, я зашел в /var/www/vhosts/domain 2/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/domain 2/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>

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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