Apache虚拟主机,用“/&”;


Apache Virtualhosts, stopping PHP throwing errors with "/"

我有一台非常稳定的开发机器,它运行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转到的位置。

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

我想这是一个相当简单/明显的指令,我错过了,但我找不到。有人能帮忙吗?

你是这个意思吗?

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

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

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

这将起作用,因为它将在您的include_path中找到includes文件夹。

PHP本身并没有真正的DocumentRoot概念来实现其文件相关函数。它似乎只是服务器的文件系统。整个DocumentRoot业务都是在Web服务器层应用的。

如果你想在代码中使用require('/....'),你需要使用mod_chroot(或mod_security的chroot功能),这样你就可以将每个vhost"监禁"到它自己的目录树中,并使/目录成为你想要的任何目录。

然而,chrooting也有其自身的问题——它会锁定文件系统的其余部分。如果你的script exec()是外部的东西,或者连接到MySQL,或者在文件系统上做任何事情,你需要在监狱里有这些可执行文件、.so库、MySQL套接字文件等的副本。

在linux中,"chrooted"环境比在windows中更常见。您可以通过从根目录中的文件中设置配置指令来确定您的根目录,并获得类似于以下的目录名

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

编辑:这种方法并不总是使用文档根,但我发现在许多情况下,我会有同一项目的多个实例,并且出于安全原因,我的大多数php文件都在文档根之外。

它将是这样的东西:

/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)