我有一个非常稳定的开发机器设置运行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一样这就是我的生产服务器似乎工作的方式,并且为了我的开发机器的利益,必须对所有内容进行编码以确定/包含/的相对路径是多么痛苦。
我希望这是一个相当简单/明显的指令,但我无法找到它。有人可以帮忙吗?
答案 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)