【问题标题】:Apache & PHP: DocumentRoot isn't working as expectedApache 和 PHP:文档根未按预期工作
【发布时间】:2013-04-30 18:48:47
【问题描述】:

我正在使用一个 LAMP 服务器,该服务器在 Apache 中将多个站点配置为子域。作为标准,每个站点/子域都位于 /var/www/ 内的一个整洁目录中。我已经告诉 Apache 每个站点位于 /etc/apache2/sites-available/ 配置文件中的哪个位置,使用多个 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 这样的 URL - 这当然会给我一个“找不到页面”错误。

我的 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,但无法弄清楚这里发生了什么。提前致谢!

【问题讨论】:

    标签: php apache


    【解决方案1】:

    Javascript 是一种客户端脚本语言。因此,您的浏览器在处理您的请求 URI(从浏览器到服务器的消息)时,会将 / 视为您域的根。

    PHP 是一种服务器端语言,因此它需要知道文件的路径。您可以在具有相对路径的同一文件夹中包含文件。此示例将在包含文件夹中:

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

    【讨论】:

      【解决方案2】:

      $_SERVER['DOCUMENT_ROOT'] 也只解析为 Apache 中设置的任何 DocumentRoot。您不应在共享服务器或虚拟主机环境中使用$_SERVER['DOCUMENT_ROOT'],因为您可能并不总是拥有正确的目录。

      建议在索引文件中使用类似

      define('DOCUMENT_ROOT', dirname(__FILE__));
      

      这是否会创建一个全局定义的DOCUMENT_ROOT,它始终正确指向您应用的根目录。

      【讨论】:

        【解决方案3】:

        某些基于其工作方式的虚拟服务器不使用$_SERVER['DOCUMENT_ROOT'] 指向共享主机文档根目录,它们指向/var/www,这是不正确的。但是,他们确实提供了 $_SERVER['VIRTUAL_DOCUMENT_ROOT'],这是您应该检查的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-27
          • 2016-03-31
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 2013-07-24
          • 1970-01-01
          • 2013-10-12
          相关资源
          最近更新 更多