Apache Virtualhosts,用“/”停止PHP抛出错误

时间:2011-06-06 15:10:08

标签: php apache

我有一个非常稳定的开发机器设置运行Apache并使用虚拟主机来保持我的项目分离,并运行我用来访问它们的dyndns.org服务。每个VHost指令通常如下所示:

<VirtualHost *:80>
    ServerName [my_internal_subdomain].[my_dyndns_name].dyndns.org
    ServerAlias home

    DocumentRoot "D:/webserver/[projectDirectory]/httpdocs"
    php_admin_value open_basedir "c:/WINDOWS/TEMP;D:/webserver/[projectDirectory]/"

    ErrorLog "D:/webserver/[projectDirectory]/logs/error.log"
    TransferLog "D:/webserver/[projectDirectory]/logs/access.log"
</VirtualHost>

显然[projectDirectory],[my_internal_subdomain]和[my_dyndns_name]都是我知道/为每个指令更改的值,只是不需要在这里发布:)

然而,有一件事总让我困惑,在PHP中,如果我想要一个来自say / includes /的文件,我希望使用:

require("/includes/myfile.php"); 

除了这样做会抛出一个open_basedir限制错误 - 因为“/”试图去,大概是D:/ - 的根,而我希望每个虚拟主机都能识别出DocumentRoot的值实际上是我想要的地方如果我通过“/".

调用文件,就像PHP一样

这就是我的生产服务器似乎工作的方式,并且为了我的开发机器的利益,必须对所有内容进行编码以确定/包含/的相对路径是多么痛苦。

我希望这是一个相当简单/明显的指令,但我无法找到它。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

你是说这个吗?

require($_SERVER['DOCUMENT_ROOT'] . '/includes/myfile.php');

答案 1 :(得分:1)

require路径采用文件系统路径,因此“/”将始终是与include_path设置相关的文件系统或路径的根。您可以稍微更改您的包含,并设置这样的包含路径来绕过它:

ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . 'D:/.../httpdocs');
require('includes/myfile.php');

这样可行,因为它会在includes中找到include_path文件夹。

答案 2 :(得分:0)

PHP本身没有DocumentRoot的真正概念,因为它的文件相关功能。它似乎只是服务器的文件系统。整个DocumentRoot业务应用于Web服务器层。

如果你想在你的代码中使用require('/....'),你需要使用mod_chroot(或mod_security的chroot功能),这样你就可以将每个vhost“jail”到它自己的目录树中,并使{{{ 1}}目录是你想要的每个目录。

然而,chrooting有其自身的问题 - 它会锁定文件系统的其余部分。如果你的脚本exec()在外部,或连接到MySQL,或在文件系统上做任何事情,你需要在jail中拥有那些可执行文件,.so库,MySQL套接字文件等的副本。

答案 3 :(得分:0)

在linux中,在Windows中拥有“chrooted”环境更为常见。您可以通过从根目录中的文件设置配置指令来确定您的root,并获取类似

的目录名称
$dirname = dirname(__FILE__);
// or however you wish to arrange your affairs.
$myConfigObject->set('root',$dirname);

编辑:这种方法并不能完全使用文档根目录,但是我发现在很多情况下我会有同一个项目的多个实例,并且出于安全原因,我的大部分php文件都将位于文档根目录之外。 / p>

这将是这样的:

/home/dir         (project root
/home/dir/stable (project instance root)
/home/dir/dev    (project instance root2)
/home/dir/stable/lib    (php files)
/home/dir/stable/web    (webroot)