PHP/在子目录中正确使用includes的方法

3
我有一个站点范围的包含文件,我在主目录中的页面中包含它。然而,我将一堆具有共同主题的页面放在一个子目录中。这些页面需要引用相同的include文件。现在我遇到了问题,因为include文件中的相对链接(例如图像)调用不同的路径,具体取决于主文件是在主目录还是子目录中。例如,如果从主目录调用include,则链接“images / pic.jpg”将起作用,但如果从子目录调用include,则会尝试转到“sub / images / pic.jpg”。
我通过使用硬链接解决了这个问题,如“/ images / pic.jpg”。但是,我不想使用硬链接,因为它们可能会在将站点移动到另一个目录时出现错误。
所有调用给定include的页面必须在同一个目录中吗?或者是否有某种技术可以使include文件中的相对链接工作,即使从子目录调用include也可以?
非常感谢。
6个回答

3

对于 HTML 内容,请使用以下元标记:

<head>
    <base href="http://www.domain.ca/base/website/" target="_blank" />
</head>

这个 meta 标签将应用于每个链接。所以,如果一个链接是 img/blabla ,而你在一个子文件夹内部,加载的图片将是 base_href + src ...。
在 PHP 中,可以在脚本开头设置一个变量,并在每个 include 之前放置它。你也可以在每个图片加载和其他内容之前写入这个变量。

3

没有硬性规定 - 您可以按照自己的方式处理您的包含文件,但您应该努力保持一致。

我管理过的最大网站散布在数百个子目录中有数千个包含文件。我们始终使用绝对路径,使用一个变量来表示根目录,然后根据需要连接剩余的路径。当我们需要移动文件时,我们只需要更改这一个变量,整个站点就会移动。

您可以使用相对链接,但我发现在尝试确定从哪里调用文件时,它们更加令人困惑。


2
在较小的项目中,一个简单的常量就可以很好地完成这项工作:假设您有两个文件 /homepage.php/contact/form.php,这两个文件都包含第三个文件 layout.php - 主文件(主页 + 表单)应通过一个常量传播它们相对于 Web 服务器根目录的位置:

homepage.php

<?php
define('WEB_ROOT', './');  // relative path to /
include('layout.php');

contact/form.php

<?php
define('WEB_ROOT', '../');  // relative path to /
include('layout.php');

layout.php

<img src="<?php echo WEB_ROOT; ?>images/pic.jpg">

1
如果我是你,我会尝试创建一个函数(类似的)来检查你当前的工作目录,然后相应地添加适当的路径维度。
<?php

// current directory
echo getcwd() . "\n";

1

我觉得你实际上正在寻找的是..目录命令。这将会说“返回上一级目录”。

从/开始:

include('includes/inc.php');

来自 /子目录:

include('../includes/inc.php');


这也适用于浏览器端。您可以在HTML、CSS和JavaScript中使用这个.... 甚至可以在任何地方使用它。尤其是在命令行中。

但老实说,我会使用绝对路径并设置一个指向网站路径的常量。这样,您只需将要附加到该常量末尾的路径追加到其中,就可以得到绝对路径了。


问题在于include从主目录和子目录中的文件中调用,因此向上一级目录的意义取决于include的调用位置。您可能对绝对路径是正确的。 - user1260310
没问题。如果您的包含文件中有引用特定路径的代码则可以使用__FILE__获取包含文件的路径,无论它从哪里被包含。 - flagoworld

0

您可以使用魔术常量__FILE__dirname(或PHP 5.3+上的__DIR__)一起构建相对于已包含文件的路径。

$image = dirname(__FILE__) . '/images/pic.jpg';

或者

$image = __DIR__ . '/images/pic.jpg';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接