我正在使用LAMP服务器,其中有几个站点在Apache中配置为子域。作为标准,每个站点/子域都位于/ var / www /内的整洁目录中。我已经告诉Apache每个站点位于/ etc / apache2 / sites-available / config文件中,使用多个VirtualHost并为每个站点指定DocumentRoot和ServerName。
当我在页面上编写javascript时,我可以根据站点根目录引用其他页面,如下所示:
include '/includes/something.js';
但我不能在PHP中做同样的事情。如果我想在PHP代码中包含一个文件,我需要输入:
include '/var/www/site_name/includes/something.php';
(我仍然可以做相对的引用,例如../includes/something.php,但这不是重点。)我很困惑为什么我需要/ var / www /,但到目前为止只是一个烦恼。一旦我发现需要完整的目录,我就可以编写代码。但是现在我正在尝试安装PHPlist,每次保存设置时,我都会被重定向到https://phplist.mydomain.org/var/www/phplist/admin/?page=configure这样的网址 - 这当然会给我一个“找不到页面”的错误。
看起来我的Apache / PHP设置如何处理网站根目录。我没有深入研究PHPlist代码,也不是特别想要的。但我假设如果我可以修改我的设置,以便我可以在PHP中包含文件而不需要/ var / www /前缀,那么PHPlist也将停止向我提供过于前缀的URL。
供参考,以下是我的大多数Apache虚拟主机的外观。我想我的具体问题是:1)你看到我告诉你的什么,需要纠正吗? 2)你会在哪里看到或者你会在接下来尝试找出这种奇怪的东西?
<VirtualHost 95.102.96.250:443>
ServerName phplist.mydomain.org
DocumentRoot /var/www/phplist
ServerAdmin admin@mydomain.org
<Directory /var/www/phplist/>
Options +FollowSymLinks
AllowOverride All
order allow,deny
allow from all
</Directory>
</VirtualHost>
希望这只是我个人的一个基本误解。我试过RingTFM,但还没弄清楚这里发生了什么。提前谢谢!
答案 0 :(得分:3)
Javascript是一种客户端脚本语言。因此,当您的浏览器处理您的请求URI(从浏览器到服务器的消息)时,您的浏览器会将/
视为您域的根。
PHP是服务器端语言,因此需要知道文件的路径。您可以在具有相对路径的同一文件夹中包含文件。此示例位于includes文件夹中:
// so /includes/header.php might include /includes/config.php like this
include('config.php');
最好使用服务器变量包含这样的代码移动路径:
include($_SERVER['DOCUMENT_ROOT'].'/includes/config.php');
为了方便编程,你可以创建一个$includes_dir
变量:
$includes_dir = $_SERVER['DOCUMENT_ROOT'].'/includes';
include($includes_dir.'/config.php');
答案 1 :(得分:2)
$_SERVER['DOCUMENT_ROOT']
也只能解析为Apache中设置的DocumentRoot。您不应在共享服务器或虚拟主机环境中使用$_SERVER['DOCUMENT_ROOT']
,因为您可能并不总是拥有正确的目录。
建议您在索引文件中使用类似
的内容define('DOCUMENT_ROOT', dirname(__FILE__));
这会创建一个全局定义的DOCUMENT_ROOT
,它始终正确指向应用的根目录。
答案 2 :(得分:2)
某些基于其工作方式的虚拟服务器不使用$_SERVER['DOCUMENT_ROOT']
指向共享主机文档根目录,它们指向/ var / www这是不正确的。但他们会提供$_SERVER['VIRTUAL_DOCUMENT_ROOT']
这是你应该检查的东西。