在子目录中使用PHP包含时的相对路径问题


Relative Path issue while using PHP Include in subdirectories

我正在构建一个PHP应用程序。应用程序本身有大量的页面,因此我决定将每个文件分类到相应的子目录中。

然而我遇到了一个问题。所有的模板资源文件夹(CSS, JS,图像等)都位于根文件夹localhost/appname/,还有导航菜单(navmenu.php)。我在每一页都包括了菜单。

当我试图将navmenu.php包含在子目录中的文件中时,问题出现了。

例如,当我在index.php中包含navmenu.php(都在根文件夹中)时,它工作得很好。但是当我在addstudent.php中包含navmenu.php位于student子目录时,navmenu.php中的所有<a href>链接都变成student/*.php(相对链接)

解决这种情况的正确方法是什么?

我有一个配置文件,它包含在所有PHP文件。我应该如何创建一个常量,我应该如何更新navmenu.php href链接中的链接?

无论目录深度如何,要始终包含它,请尝试以下操作

include $_SERVER['DOCUMENT_ROOT'] . "/includes/navmenu.php";

应该返回如下内容:/home/<user>/public_html/includes/navmenu.php

在我的大多数项目中;我也有一个类似的设置文件:

$LiveDir = "http://localhost/project";
$RootDir = "/home/user/public_html/project";

这在更改主机名时主要是有益的,因为您只需更改一个文件中的链接,而不必遍历所有页面并更新链接

<a href='<?=$LiveDir?>/some/directory/index.php'>Some Link</a>

我在一个巨大的客户关系管理系统中使用类似的设置在工作和家庭之间工作。如果我在家里,链接会以http://127.0.0.1/为前缀,当我在工作时,它会自动转换为http://192.168.10.23/Matilda

注意:$_SERVER在cron作业期间不会被填充。解决方法:

创建一个包含以下内容的文件:CronMgr.php(例如),并将cron作业定向到该文件:

<?php file_get_contents("/full/path/to/the/script.php"); ?>

这将打开一个实例,其中$_SERVER 填充,脚本将正常运行。

这是浏览器的正常行为。有两种方法可以解决你的问题:1. 链接以"/"开头,即:'/index.php', '/about.php'等。这使得浏览器从网站的根创建url。2. 使用PHP:

在navmenu.php中编写页面的完整路径
$rootPath = 'http://example.com/';
<a href="<?php echo $rootPath; ?>">Home</a>
<a href="<?php echo $rootPath.'/about.php'; ?>">About</a>

在这种情况下,我将定义一个常量来保存项目根目录路径,并包含与此相关的所有内容。这样可以避免使用相对路径include。

。确保所有页面都加载了这个。例如,一个通用的配置文件或通用的index.php。我不知道你是怎么安排的。(或者使用其他地方指出的$_SERVER['DOCUMENT_ROOT'])

define('PROJECT_ROOT','/localhost/appname/');

,然后在其他地方

include(PROJECT_ROOT . 'navmenu.php');