【问题标题】:PHP: How to get the document root from inside a user directory?PHP:如何从用户目录中获取文档根目录?
【发布时间】:2011-01-08 16:29:21
【问题描述】:

我开发各种 PHP 应用程序并将其部署到不同的环境。尤其是在开发环境中,它们可以在任何地方,从 document_root 到 /Users/me/Sites/ 甚至 /Users/me/Sites/someapp/

在这些应用程序中,我需要知道“应用程序根”在哪里,一次是真实路径,一次是 URL。路径没有问题。假设我在应用程序根目录中有一个 bootstrap.php:

define("BASE_DIR", realpath(dirname(__FILE__)));

但是,我无法可靠地获取基本 URL。在大多数环境中,只需从 BASE_DIR 中减去文档根即可:

define("BASE_URL", str_replace($_SERVER['DOCUMENT_ROOT'],'',BASE_DIR) . "/");

现在,我的问题是:这不适用于我的应用程序位于我的用户目录中的环境,因为 PHP 仍然可以看到主文档根目录。有人解决了这个问题吗?

【问题讨论】:

  • 谢谢,但我只是在那里尝试了解决方案,它给出的结果取决于文件的位置,包括给定的代码。
  • 或者更确切地说:该解决方案要求 bootstrap.php 始终位于根目录中(尽管为了简单起见,我另有说明,但我将它放在“includes/”目录中)。但我想最简单的解决方案是将其移至顶部并使用此处链接的解决方案。

标签: php apache directory document-root


【解决方案1】:

当服务器配置了别名时,任何涉及 realpath() 和 DOCUMENT_ROOT 的事情都会失败。考虑一个 Apache 有这样一个配置的场景:

DocumentRoot /home/httpd/html
Alias /testalias /home/otherdir

您可以通过example.com/testalias/script.php 访问脚本。

脚本将返回:

realpath(dirname(__FILE__)) -> /home/otherdir
$_SERVER['DOCUMENT_ROOT'] -> /home/httpd/html
BASE_DIR -> /home/otherdir
BASE_URL -> /home/otherdir/

但网站的其余部分实际上存在于/home/httpd/html

根据$_SERVER['SCRIPT_NAME'](即 URL 的路径/脚本名称部分)重建 URL 可能会更好:

$_SERVER['SCRIPT_NAME'] -> /testalias/script.php

【讨论】:

  • 解决方案的作用是由 alexn 链接为可能的重复项。我认为他是对的,问题是一样的,但我仍然认为那里的解决方案只适用于应用程序根目录中的引导文件。 stackoverflow.com/questions/176712/…
  • 我在使用 Alias 目录时使用这个 str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME'])
  • SCRIPT_NAME 的问题在于它不是静态的,因为它基于当前执行脚本的名称。在 Apache 2.3.x 被普遍采用之前,我们可以使用 CONTEXT_PREFIX 变量。恐怕没有解决办法。
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多