代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

如何格式化PHP include()绝对(而不是相对)路径?

  •  23
  • Zack Peterson  · 技术社区  · 16 年前

    在我的PHP网站的各个页面和各种嵌套目录中,我想在相对于根的路径中包含一个特定的文件。

    我可以在这两个页面上放置哪个命令。..

    http://www.example.com/pageone.php
    http://www.example.com/somedirectory/pagetwo.php

    …包括此页面:

    http://www.example.com/includes/analytics.php

    这不起作用:

    <?php include('/includes/analytics.php'); ?>
    

    这在Windows上的IIS中托管重要吗?

    9 回复  |  直到 16 年前
        1
  •  26
  •   J Cooper    16 年前

    你可以直接使用 include $_SERVER['DOCUMENT_ROOT'] . "/includes/analytics.php";

        2
  •  9
  •   Zoredache    12 年前

    从PHP的角度来看,根是web服务器上文件系统的顶部,而不是从web浏览器的角度来看。

    大多数人都会做下面的一件事。

    在全局配置文件中定义一个常量,并在每次调用中使用该常量进行require/include。

    或者他们使用这样的代码。

    require_once realpath(dirname(__FILE__).'/config.php');
    require_once realpath(dirname(__FILE__).'/lib/Database.php');
    

    在某些情况下,使用环境变量可能是危险的,并且是安全问题的根源。

        3
  •  8
  •   Greg    16 年前

    正如@Stefan Mai所说,PHP没有“根”路径,但你可以很容易地定义一个——大多数网站都有一个每次都包含的页面(例如配置文件),你可以添加到其中:

    define('ROOT', dirname(__FILE__));
    

    然后使用include ROOT。'/include/analytics.php';

    同样非常有用的是auto_prepend指令,您可以在apache上的.htaccess中使用它——不确定是否在IIS上设置它(尽管您可以在PHP ini中有一个全局指令)。

        4
  •  5
  •   Community CDub    8 年前

    如果你给include()或require()(或*_once版本)一个绝对路径名,该文件将被包含在内。绝对路径名在unix上以“/”开头,在Windows上以驱动器号和冒号开头。

    如果你给出了一个相对路径(任何其他路径),PHP将按顺序搜索配置值“include_path”中的目录,直到找到匹配项或没有更多目录可供搜索。

    因此,简而言之,要包含一个绝对文件名,请给出一个绝对的文件名。另请参见功能 realpath() .

    如果你想设置自己的include“root”,请查看 this question (特别是我的回答:-)

        5
  •  4
  •   gmadd Charles    13 年前

    我综合了上述建议,得出了这个结论。

    在我的 config.php 文件,我将ROOT定义为:

    define('ROOT', $_SERVER['DOCUMENT_ROOT']);

    然后我在后续文件中使用它:

    include_once(ROOT."/someFile.php");

    include_once(ROOT."/includes/someFile.php");

        6
  •  1
  •   Stefan Mai    16 年前

    使用。.向上查找目录。所以在pageone.php中

    include 'includes/analytics.php';
    

    在pagetwo.php中

    include '../includes/analytics.php';
    

    据我所知,PHP中没有你所指的“根”的概念,但如果你愿意,你可以定义它。祝你好运!

        7
  •  1
  •   Zack Peterson    16 年前

    这行得通。

    <?php include('c:/inetpub/example.com/includes/analytics.php'); ?>
    

    我得去做 c:/inetpub/example.com/ 分割某种全局变量,使其在服务器之间具有一定的可移植性。

        8
  •  0
  •   user42092 user42092    16 年前

    波浪号被shell解释为一个特殊字符,因此无论操作系统如何,在PHP代码中使用它都不起作用。

    如果你试图访问与用户主目录相关的内容,你可以尝试 getenv() -我很确定Windows设置了一个环境变量,相当于 $HOME .

        9
  •  0
  •   Santiago    12 年前

    我发现的方式是:

    <?php include $_SERVER['DOCUMENT_ROOT'].'\\Your\\Site\\Path.php' ?>
    

    当你有一些可以转义的特殊字符(即\n)时,\\是必要的,这样\\就在字符串上了。

    因为你在windows中,所以你必须使用\而不是/

    推荐文章