17

我想做的是将'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

我也尝试过开启和关闭安全模式。

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>

谢谢大家!

4

7 回答 7

9

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

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

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

于 2010-03-09T11:57:46.897 回答
2

您可以从任何您想要的地方包含文件,除非您的 PHP 脚本的权限或安全模式阻止它。您的第一种方法非常好。你得到什么错误?

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

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

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

于 2010-03-03T09:39:33.410 回答
2

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

ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com");
require "filename.php";
于 2010-03-13T18:22:19.003 回答
1

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

于 2010-03-13T16:08:59.247 回答
0

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

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

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

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

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

于 2010-03-08T10:20:38.417 回答
0

在测试 php 文件上尝试 chmod 777 以查看它是否有效,如果它确实存在权限问题。也做一个简单的 phpinfo() 看看保存模式是否打开。

于 2010-03-08T10:21:55.543 回答
0

如果您尝试要求不同的文件会发生什么:

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

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

那样有用吗?如果是这样,请将 test.php 放在其他位置并重试。它仍然有效吗?

于 2010-03-08T19:12:57.687 回答