2010-03-03 7 views
16

Что я хочу сделать, это включить '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/ВХосты' на '/' или что угодно):

<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> 

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

+0

«не будет работать» не поможет нам определить проблему. Что происходит? Какие ошибки сообщаются (в том числе в журналах сервера)? – Quentin

+1

Повторите свое обновление, это похоже на то, что файл не существует или права установлены неправильно. Вы на 1000% уверены, что он существует? Кому он принадлежит (пользователь/группа)? Какой пользователь выполняет PHP? –

+0

Как я могу проверить, какой пользователь использует PHP? – Brayn

ответ

9

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

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

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

2

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

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

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

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

+0

Мы делаем (в основном я), но у хостинговой компании есть некоторые нечетные меры безопасности (например, я не могу устанавливать расширения PHP непосредственно из PEAR). Спасибо за подсказку, я проведу с ними в тюрьме. – Brayn

0

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

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

также убедитесь, что .htaccess имеет возможность followsymlink установить истинного

как о попытке это в file2.php в domain2?

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

+0

Я не согласен. Вполне нормально использовать некоторую центральную библиотеку кода. Люди делают это все время с PEAR. Однако плохой практикой является то, что он помещает несколько доменных кодов в один домен. Он должен просто сделать папку за пределами vhosts для нее. – douwe

+0

PEAR - это библиотека, которая по умолчанию будет включена в путь включения. Они включены хостинг-провайдером. лучший подход всегда будет иметь вашу зависимость локально, а не глобально через домены. центральная библиотека кода полезна только в пределах домена. – coder

+0

@coder Это то, что я хочу сделать. На самом деле есть один домен и одно место вне vhosts, но именно так я изначально разместил вопрос, и для ясности я не изменил пути. Благодарю. – Brayn

0

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

+0

Я пробовал это. Посмотрите прямые комментарии к вопросу для других тестов, которые я сделал. Спасибо. – Brayn

0

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

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

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

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

+0

Я пробовал с несколькими файлами. Если включенный файл находится в том же домене (в том же webroot) он работает нормально.Если я перемещаю файл в другое место за пределами этого, он не будет работать. – Brayn

1

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

+0

Если текущий пользователь не может даже * видеть * файлы за пределами каталога текущего домена, вероятно, что есть механизм безопасности на месте который не может быть обойден простой символьной ссылкой, но все равно стоит попробовать. –

+0

он упомянул об проверке всех файлов в bash, поэтому я ожидаю, что у него будет доступ. – naugtur

+0

Я пробовал символическую ссылку, но она не работает (я упоминал, что где-то в комментариях. Также я решил проблему и обновил сообщение некоторое время назад. Спасибо, в любом случае! – Brayn

2

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

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

Это должно было сработать, и я попробовал, я уже упоминал здесь, что добавил путь к пути include. Проблема заключалась в установке open_basedir в php.ini, см. Сообщение для обновления с ошибками. Благодаря! – Brayn