【问题标题】:PHP/Proper use of includes in subdirectory [closed]PHP /正确使用子目录中的包含[关闭]
【发布时间】:2012-06-26 18:35:08
【问题描述】:

我有一个站点范围的包含文件,该文件包含在主目录的页面中。但是,我将一堆具有共同主题的页面放在子目录中。这些页面需要引用相同的包含文件。我现在遇到了包含文件中的相关链接的问题,例如图像,因为它们根据主文件是在主目录中还是在子目录中调用不同的路径。例如,如果从主目录调用包含,则链接 "images/pic.jpg" 将起作用,但如果从子目录调用包含,则会尝试转到 "sub/images/pic.jpg"

我已经通过使用像/images/pic.jpg 那样返回根目录的硬链接解决了这个问题。但是,我宁愿不使用硬链接,因为如果将网站移动到另一个目录等,它们可能会中断。

是否所有调用给定包含的页面都必须位于同一目录中?或者是否有一些技术可以使包含中的相对链接起作用,即使从子目录中调用包含?

非常感谢。

【问题讨论】:

    标签: php hyperlink subdirectory


    【解决方案1】:

    没有硬性规定 - 您可以根据需要处理包含的内容,但您应该努力保持一致。

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

    您可以使用相对链接,但当您试图弄清楚从何处调用哪些文件时,我发现它们更加令人困惑。

    【讨论】:

      【解决方案2】:

      对于 HTML 内容,请使用此元:

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

      此元将应用于每个链接。因此,如果链接是img/blabla,并且您位于子子子文件夹中,则加载的图像将为 base_href + src ...

      在 PHP 中,在脚本的开头设置一个变量并将其放在每个包含之前。 您也可以在每次加载图像之前编写此变量。

      【讨论】:

        【解决方案3】:

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

        主页.php

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

        联系人/form.php

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

        layout.php

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            在我看来,您正在寻找的是.. 目录命令。这会说“上一个目录”。

            来自/:

            include('includes/inc.php');

            来自 /sub:

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


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

            老实说,我会使用绝对路径并设置一个常量来引用站点的路径。这样你就可以将你想要的路径附加到该常量的末尾以获得绝对路径。

            【讨论】:

            • 问题是包含是从主目录中的文件和子目录中调用的,因此上一个目录意味着不同的事情,具体取决于调用包含的位置。关于绝对路径,您可能是对的。
            • 没关系。如果您的包含文件中有代码引用基于自身的特定路径,您实际上可以获取包含文件的路径,无论它是从哪里包含的:__FILE__
            【解决方案6】:

            您可以使用 __FILE__ magic constantdirname(或 PHP 5.3+ 上的 __DIR__)来构建相对于包含文件的路径。

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

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

            【讨论】:

              猜你喜欢
              • 2014-11-30
              • 1970-01-01
              • 2014-12-16
              • 1970-01-01
              • 2017-08-09
              • 2021-10-03
              • 2017-10-10
              • 2016-10-03
              相关资源
              最近更新 更多