28

我的包含文件有问题。当我使用 require_once('somefile.php') 时,我似乎无法弄清楚如何构建我的 URL。如果我尝试在多个目录结构不同的地方使用包含文件,我会收到一个错误,即找不到包含文件。

在 asp.net 中,要获取我的应用程序根路径,我可以使用 ~/directory/file.aspx。tild 正斜杠始终知道我是从我的网站根目录引用并找到文件,无论请求来自我的网站中的哪个位置。它总是返回根目录并从那里查找文件。

问题:如何获取网站的根路径?我怎样才能做到这一点,以便我可以从我的站点中的任何地方重用我的包含文件?我必须在我的 URL 中使用绝对路径吗?

谢谢!

4

7 回答 7

24

那里$_SERVER['DOCUMENT_ROOT']应该有你的网络服务器的根路径。

编辑:如果您查看大多数主要的 php 程序。使用安装程序时,您通常输入应用程序文件夹的完整路径。安装程序只会将其放入整个应用程序中包含的配置文件中。一种选择是使用自动前置文件来设置变量。另一种选择是在您需要的每个页面上只包含_once()配置文件。我建议的最后一个选项是使用引导程序编写您的应用程序,这是您通过一个文件(通常使用 url_rewrite)汇集所有请求的地方。这使您可以轻松地在一个位置设置/包含配置变量,并使它们在所有脚本中都可用。

于 2010-10-17T08:51:26.860 回答
12

我通常将config.php文件存储在ROOT 目录中,并在其中config.php写道:

define('ROOT_DIR', __DIR__);

然后在所有其他脚本中使用ROOT_DIR常量。使用$_SERVER['DOCUMENT_ROOT']不是很好,因为:

  • 它并不总是匹配ROOT_DIR
  • 此变量在CGI模式下不可用(例如,如果您通过 CRON 运行脚本)
于 2010-10-18T16:41:34.937 回答
1

很高兴能够在每个脚本的顶部使用相同的代码,并且知道您的页面将正确加载,即使您位于子目录中也是如此。我使用这个,它依赖于你知道你的根目录被称为什么(通常是'htdocs'或'public_html':

defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html');

通过一致地定义 SITEROOT,您可以访问配置文件和/或页面组件,而无需逐个脚本地调整路径,例如存储在根文件夹之外的配置文件:

require_once SITEROOT . "/../config.php";
于 2017-08-14T09:31:05.407 回答
0

您应该使用内置的魔术常量来查找文件。__FILE____DIR__。如果您使用的是 PHP < 5.3,您应该使用dirname(__FILE__)

例如

require_once __DIR__.'/../../include_me.php';

$_SERVER['DOCUMENT_ROOT']并不总是保证返回您所期望的。

于 2010-10-17T11:25:02.643 回答
-1

在某处的配置文件中定义它。

假设您使用的是 MVC 样式,其中所有内容都通过单个 index.php 进行路由,那么

realpath('.');

将向您显示当前工作目录的路径(即 index.php 所在的位置)

那么您可以将其定义为

define('PROJECT_ROOT', realpath('.'));

如果它不是 MVC 并且您需要它来处理子文件夹中的文件,那么您可以将其硬编码在配置文件中

define('PROJECT_ROOT', 'C:/wamp/www/mysite');

然后当包括你可以做的事情时;

include PROJECT_ROOT . '/path/to/include.php';
于 2010-10-17T11:32:22.223 回答
-1

您可以在.htaccess文件中交替设置基本目录

SetEnv BASE_PATH C:/wamp/www/mysite/

然后在PHP中你可以引用它$_SERVER['BASE_PATH']

于 2010-10-18T00:49:56.643 回答
-3

尝试这个:

$_SERVER['DOCUMENT_ROOT']
于 2010-10-17T08:51:47.530 回答