我的包含文件存在问题。当我使用require_once('somefile.php')时,我似乎无法弄清楚如何构建我的URL。如果我尝试在目录结构不同的多个地方使用包含文件,则会收到无法找到包含文件的错误。
在asp.net中,要获取我的应用程序根路径,我可以使用〜/ directory / file.aspx。 tild正斜杠总是知道我从我的网站根目录引用并找到该文件,无论我的网站中的请求来自何处。它总是返回根并从那里查找文件。
问题:如何获取网站的根路径?我该怎么做才能在网站的任何地方重用我的包含文件?我必须在网址中使用绝对路径吗?
谢谢!
答案 0 :(得分:21)
$_SERVER['DOCUMENT_ROOT']
应该有您的网络服务器的根路径。
编辑:如果你看看大多数主要的PHP程序。使用安装程序时,通常输入应用程序文件夹的完整路径。安装程序将把它放在整个应用程序中包含的配置文件中。一种选择是使用auto prepend file来设置变量。另一种选择是在你需要的每个页面上只需include_once()配置文件。我建议的最后一个选项是使用bootstrapping为您编写应用程序,您可以通过一个文件(通常使用url_rewrite)汇集所有请求。这使您可以在一个位置轻松设置/包含配置变量,并使它们在所有脚本中都可用。
答案 1 :(得分:10)
我通常将config.php
文件存储在 ROOT目录中,并在config.php
我写道:
define('ROOT_DIR', __DIR__);
然后在所有其他脚本中使用 ROOT_DIR 常量。
使用$_SERVER['DOCUMENT_ROOT']
并不是很好,因为:
答案 2 :(得分:0)
您应该使用内置的魔术常量来查找文件。 __FILE__
和__DIR__
。如果您使用PHP< 5.3你应该使用dirname(__FILE__)
E.g。
require_once __DIR__.'/../../include_me.php';
$_SERVER['DOCUMENT_ROOT']
并不总是保证会返回您期望的内容。
答案 3 :(得分:0)
很高兴能够在每个脚本的顶部使用相同的代码,并且知道您的页面将正确加载,即使您在子目录中也是如此。我使用它,它依赖于你知道你的根目录被调用(通常是'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";
答案 4 :(得分:-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';
答案 5 :(得分:-1)
您可以选择在.htaccess
文件
SetEnv BASE_PATH C:/wamp/www/mysite/
然后在PHP中,您可以使用$_SERVER['BASE_PATH']
答案 6 :(得分:-2)
试试这个:
$_SERVER['DOCUMENT_ROOT']