如何使用PHP包括具有相对路径的多个目录/子目录

时间:2009-09-28 17:20:34

标签: php html include

我正在尝试构建的cms系统中的路径有困难,我基本上有一个带有header.php和footer.php文件的文件夹。

这些包含在index.php中并且正常工作。但是当我尝试在我的admin子目录中的文件中使用相同的包含时,图像和CSS被破坏,显然是因为相对路径现在是错误的。

所以我的问题是,我怎么能克服这个?

在阅读了这里和其他各种来源的其他一些问题之后,我认为绝对路径是前进的方向,但我总是使用相对路径,因此使用配置文件指定绝对路径的各种概念令人困惑我

我经常设法为自己解决问题,但这是漫长的一天,我很难过!

5 个答案:

答案 0 :(得分:21)

我通常在我的应用程序根目录中有一个名为config的文件,在其中我为基本路径和其他几个定义了一个常量:

define('APP_BASE_PATH', dirname(__FILE__));
define('APP_FUNCTIONS_PATH', APP_BASE_PATH . '/functions');

我包含我的文件,如

include (APP_BASE_PATH . 'includes/another_file.php');
include (APP_FUNCTIONS_PATH . '/function_file.php');

这样我可以将我的应用程序放在任何目录中,而且我可以移动文件而不用担心。

也使用完整路径使包含更快

答案 1 :(得分:5)

我更喜欢设置环境变量(在Apache中,使用.htaccess或.conf)。通过这种方式,您可以在webroot中的任何位置自由移动所有文件,并且可以访问这些变量。

SetEnv lib /library/folder/
SetEnv public /my/web/root/
SetEnv environ DEVELOPMENT

您还可以使用上面.htaccess片段中提到的名为'environ'的变量,在所有脚本中包含服务器特定文件作为配置文件,并在那里设置各种变量。

require_once getenv('lib')."Configs/Config_".getenv('environ').".php";

享受你的自由!

答案 2 :(得分:2)

...或

include($ _ SERVER ['DOCUMENT_ROOT']。'/ includes / header.php');

答案 3 :(得分:1)

PHP中的相对路径和绝对路径有点脆弱,因为它们不仅依赖于包含文件的当前目录,还依赖于当前工作目录。

所以你需要一个由两部分组成的解决方案。

首先,您需要一个重定向器。基本上,这是一个包含文件,用作所有其他页面的单点调用。它的工作是包括其余的基础设施。您的所有页面都调用此重定向器,并且只调用此重定向器(但您可以将它们链接起来)。

此重定向器现在

 include_once dirname(__FILE__).'/include/include.php';

这使您可以更改基础结构的包含文件或位置,并且您必须更新的所有内容都是一个文件。 dirname()调用解决了所有相对和绝对问题,并让它寻找相对于自身的下一步。根据定义,这只会在您更改时发生变化,因此它始终有效。

第二部分是自定义包含器,因此您可以使用函数按名称调用内容,然后获取正确的文件。在您的基础架构目录中埋藏这个是在哪里。然后它变成一个黑盒子,这个区域外的页面在不知道的情况下调用,而不需要知道它是如何工作的或它在哪里。这消除了路径常量包含页面片段的需要,因为你有一个地方为你做这一切。

答案 4 :(得分:0)

我遇到过类似问题,并在此链接中发布了此查询。该网址为:Issue with PHP include with global path

在研究人们给出的解决方案并查看各种线程(包括这一个 - 我在帖子底部的解决方案中引用过)时,我有办法!我也发布了解决方案。它可能会帮助一些面临类似问题的人。