我想要做的是将'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>
谢谢大家!
答案 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放在其他位置并再次尝试。它还能用吗?