从根目录包含 PHP 文件

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

当引用图像时,我几乎总是执行以下操作

<img src="/images/logo.png" alt="logo">

这是一个相对文件路径,但它从网站的 根公共目录 开始。这样,它始终引用相同的位置,**无论代码片段最终位于哪个目录**。如果它没有以“/”开头,它仍然是一个相对文件路径,但位置将取决于您当时所在的目录。当您在 /index.php 时可能没问题,但如果它移动到 /contact/,文件路径将断开,因为images 文件夹位于根目录,而不是 /contact/ 中。

常识性内容。

但是,在处理像 PHP 这样的服务器端语言时,事情会变得更加复杂。您也可以使用 PHP 以这种方式进行包含

<?php include("header.php"); ?>

因为它没有以“/”开头,所以它遇到了与图像示例遇到的相同问题。如果包含代码移动到不同的目录,引用可能会断开。但是,对于 PHP,简单地使用开头的“/”**将不起作用**,这可能会非常令人困惑。

问题是 PHP 可以比 HTML 更深入地看到您的服务器文件系统。例如,CSS-Tricks 的公共 Web 目录实际上位于我的服务器上的“/var/www/vhosts/css-tricks.com/httpdocs”中。因此,当您在开头使用“/”进行包含时,它会比您想要深入的方式深入很多。您实际上希望它查看公共 Web 目录。在我的例子中,是“httpdocs”。

为了恢复此功能并拥有不会更改的相对文件路径,请使用以下 PHP 智能代码

<?php 
   $path = $_SERVER['DOCUMENT_ROOT'];
   $path .= "/common/header.php";
   include_once($path);
?>

对于所有程序员来说都是基本的东西,但这一个让我困惑了很长时间。

另一种技术

阅读 Brian Vanderberg 在

我发现,在某些环境中,DOCUMENT_ROOT 似乎没有正确设置。我设计了一种方法,它独立于服务器,以及托管提供商是否提供了设置包含或自动前缀路径的能力。

每个目录都包含一个名为 '__php__.php'(或任何想要命名的名称)的 'meta' 文件。对于该目录中的任何文件,只需将其包含为 <?php include('__php__.php'); ?>。该文件本身只是包含父目录中的文件,一直向上到站点根目录。站点根目录中的文件然后可以包含其他文件,这是一种简单的方法来自动包含文件,即使服务提供商不支持,也可以定义一个变量,例如 'SITE_ROOTDIR',然后可以在以后使用。如果文档文件移动到另一个目录,它们仍然会包含该目录中的 __php__.php 文件,并且仍然从顶部的 __php__.php 文件中获取 SITE_ROOTDIR 常量。

我还会对一个简单的导航栏执行类似的操作,其中每个目录都有一个 __navbar__.php 文件,每个页面只需在正确的位置包含它,它就可以包含父导航元素并定义自己的导航元素。

这样做的一个优点是可以将站点的一部分分割成子目录,并且仍然获得该部分的根目录,即使它不是实际的文档根目录。缺点是,对于流量较大的网站,执行所有包含操作可能会降低速度。

还有另一个

<?php set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); ?>