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

2022-08-30 23:37:57

我想做的是将“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开和关。

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>

谢谢大家!


答案 1

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

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

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


答案 2

您可以从所需的任何位置包含文件,除非 PHP 脚本的权限或安全模式阻止它。你的第一种方法完全没问题。您会遇到哪些错误?

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

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

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


推荐