【问题标题】:PHP require file from top directoryPHP需要来自顶级目录的文件
【发布时间】:2011-11-29 14:36:58
【问题描述】:

我有几个子域包含在我的根站点上方的自己的目录中,并且在我的根目录中有一个资产文件夹。例如:

/
/assets/
/forums/
/blog/

我正在尝试在根目录和子目录中的 php 页面上 require() 文件,例如,assets/include/form.php 在根目录和 index.php 中的 index.php 中都是 required() .php 在论坛目录中。然而,在 form.php 内部,是另一个要求,试图获取包含在包含目录中的另一个文件。

我似乎无法找到一种方法来要求此 form.php 中的文件,该文件将同时适用于根目录的 index.php 和论坛目录的 index.php。

有什么方法可以明确要求从根目录开始的文件?

【问题讨论】:

    标签: php include directory require


    【解决方案1】:

    有几种方法可以实现这一点。

    使用来自form.php的相对路径

    require_once __DIR__ . '/otherfile.php';
    

    如果您使用的是 PHP 5.2 或更早版本,则可以使用 dirname(__FILE__) 代替 __DIR__。阅读更多关于魔法常数的信息here

    使用$_SERVER['DOCUMENT_ROOT'] 变量

    这是文档根目录的绝对路径:/var/www/example.org/ 或 Windows 上的 C:\wamp\www\

    文档根目录是您的根级别文件所在的文件夹:http://example.org/index.php 将在 $_SERVER['DOCUMENT_ROOT'] . '/index.php'

    用法:require_once $_SERVER['DOCUMENT_ROOT'] . '/include/otherfile.php';

    使用自动加载器

    如果它非常简单,这对您的应用程序来说可能有点过头了。

    设置 PHP 的包含路径

    您还可以设置使用require()include() 时PHP 查找文件的目录。查看set_include_path()here

    用法:require_once 'otherfile.php';


    注意:

    我看到一些答案建议使用require() 中的 URL。我不建议这样做,因为在包含 PHP 文件之前会对其进行解析。这对于输出 HTML 的 HTML 文件或 PHP 脚本来说是可以的,但如果你在那里只有一个类定义,你会得到一个空白的结果。

    【讨论】:

    • 您是否对$_SERVER['DOCUMENT_ROOT'] 进行任何清理/验证,以防它包含邪恶字符?
    • @Steve:不。这是您的应用程序运行的系统提供的变量,因此不是用户提供的。如果此变量包含“邪恶字符”,则说明您有配置问题或您的系统已被黑客入侵。这些都不是您的应用程序可以做的很多事情。
    【解决方案2】:

    如果更高一级使用:

    include('../header.php');
    

    如果高两级:

    include('../../header.php');
    

    更多信息,请访问:http://forums.htmlhelp.com/index.php?showtopic=2922

    【讨论】:

      【解决方案3】:
      • 假设你有 pgm1.php www.domain.com/dir1/dir2/dir3/pgm1.php,包括或要求 'dirA/inc/Xpto.php'。
      • 和 www.domain.com/dirZ1/dirZ2/pgm2.php 中的另一个 pgm2.php, 其中包括或需要相同的“dirA/inc/Xpto.php”。
      • 并且您的主机配置未授权 require/include 'http://www.domain.com/......'
      • 所以...您可以在 pgm1.php 和 pgm1.php 以及 REQUIRE 或
        中使用它 包括作品!

        function rURI($p){
           for($w='',$i=1;$i<(count(explode('/',$_SERVER['PHP_SELF']))-1);$i++,$w.='../');return
           $w.$p; }
        

        需要 rURI('dirA/inc/Xpto.php'); // 根路径

      【讨论】:

        【解决方案4】:

        您有 2 个解决方案。您可以使用文件的完整 URL,例如,如果您的文件位于“lib”目录中,您可以使用: require_once ('http://www.example.com/lib/myfile.php')

        您可以尝试 PHP 中的 $_SERVER['DOCUMENT_ROOT'] 函数,但这并不总是万无一失的。

        【讨论】:

        • require_once ('http://www.mysite.com/lib/myfile.php')?不,除非他启用了allow_url_fopen
        • 一种更简单、更干净的方法是使用:
        【解决方案5】:

        也许这不是正确的主题,也许不是正确的用法,但也许它会对某人有所帮助。当我想从绝对路径在菜单中创建链接时,当我从一个目录跳转到另一个目录并且路径不断变化时,我想修复到基本目录。

        因此,我没有使用 '../' 进入子文件夹(因为我不知道很多我需要进入 ../../../),而是将链接写为 &lt;a href='/first_dir/second_dir/third_dir//..'&gt;,类似它也适用于&lt;img src='/first_dir/second_dir//../logo.svg'&gt;。 不幸的是,这不适用于require_once()。 PHP 7

        【讨论】:

          【解决方案6】:

          你为什么不使用 (../)

          require('../folder/file.php');
          

          【讨论】:

          • 因为您的解决方案是错误的(您不能以这种方式使用require;请阅读其他答案并了解其正确用法),此外,这个问题是 4 年前提出的并且得到了很多更好更全面的答案?请在回答这里之前确保您正确了解整个情况;什么意思:理解问题+知道如何解决它+理解其他答案已经提供了什么。此外,回答这么老的问题(用公认的答案)很少是一个好主意。
          猜你喜欢
          • 1970-01-01
          • 2014-10-04
          • 1970-01-01
          • 2023-03-17
          • 2013-06-11
          • 1970-01-01
          • 2015-01-19
          • 2013-10-05
          相关资源
          最近更新 更多