如何在文件根目录外包含文件?

时间:2010-03-03 09:37:28

标签: php include include-path

我想要做的是将'domain1'中的'file1.php'包含在'domain2'上的'file2.php'中。所以我认为我应该做的是这样的事情:

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 On和Off。

UPDATE2:我还在我的测试文件上将权限更改为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 个答案:

答案 0 :(得分:9)

如果open_basedir生效,则无法完成此操作,这会阻止PHP遍历主目录。

您可以做的是确保docroot1和docroot2归同一组中的用户所有,相应地设置组权限,并使用docroot2到docroot1的符号链接来读取其他Web根目录。

或者,重新构建PHP并让它像其他每个进程一样遵循典型的* nix权限:)

答案 1 :(得分:2)

您可以在任何地方包含文件,除非您的PHP脚本具有权限,或safe mode阻止它。你的第一种方法非常好。你得到了什么错误?

重新评论,这似乎证实了PHP内部无法访问绝对存在的文件。至于它可能是什么,Suhosin被排除在外,我唯一能想到的是PHP或Apache是​​某种chroot Jail

  

chroot jail的主要好处是jail会将守护进程可以看到的文件系统部分限制在jail的根目录中。此外,由于jail只需要支持Apache,因此监狱中可用的程序可能非常有限。最重要的是,不需要setuid-root程序,它可用于获取root访问权并打破jail。

我从未使用过这样的东西,所以我不能告诉你如何发现它(除了在glob()上做/var/www/vhosts并看看会发生什么。但我认为这会有由管理员设置。谁运行你的机器?

答案 2 :(得分:2)

这适用于我管理的几台机器

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

答案 3 :(得分:1)

我坐在这里想知道为什么你没有做一个符号链接。或者我错了什么? 您可以将包含所需包含的文件夹符号链接到您有权访问的路径。

答案 4 :(得分:0)

你正在使用的是不好的做法。将依赖代码放入特定于域的。复制相同的代码是正确的方法,因为它不会影响两个站点的操作。

尝试创建file1.php的符号链接,并包括它就好像来自本地目录。

还要确保.htaccess的followymlink选项设置为true

在domain2的file2.php中尝试这个怎么样?

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

答案 5 :(得分:0)

在测试php文件上尝试chmod 777以查看是否有效,如果有,则会出现权限问题。 还要做一个简单的phpinfo()并查看是否启用了保存模式。

答案 6 :(得分:0)

如果您尝试要求其他文件会发生什么:

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

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

这有用吗?如果是这样,请将test.php放在其他位置并再次尝试。它还能用吗?