【问题标题】:PHP Path to Include Files包含文件的 PHP 路径
【发布时间】:2011-11-24 13:53:26
【问题描述】:

我有一个带有 index.php 的网站。 index.php 有许多包含文件,如

 <?php include_once('scripts/php/index_mainImageJoin.php');?>

我在根目录下创建了一个名为“extrapages”的新文件夹,我将在其中创建包含与该站点相关的信息的页面。我已经像上面一样添加了 include_once 文件并更改了路径,这些都很好。

我发现的问题是包含文件中的路径失败。例如:如果图像或其他包含文件在包含中,则从“extrapages”文件夹运行时会失败。路径问题。

有什么好的方法来解决这个问题吗? 我可以将“extrapages”下页面的站点根目录 (www) 的路径更改/设置为一个文件夹吗?

我可以将这些页面移动到根目录,它们会运行良好,但我真的不希望网站根目录上的所有混乱。

任何想法&谢谢

【问题讨论】:

  • 你包括图片?! O_o
  • 如果是上传的,他要求用那个进行 LFI 注射。 >_>

标签: php .htaccess include-path


【解决方案1】:

您应该使用dirname__FILE__,通过使用这两个常量,您应该能够包含相对于当前文件的文件,而不是网络服务器调用的 php 脚本。

例如

include_once dirname(__FILE__) . '/../include.php';

dirname: 将返回路径的目录部分

__FILE__: 是一个神奇的常数,它被当前文件的路径所取代。

这样做的唯一问题是您锁定了项目的结构,但大多数情况下这是可以接受的。

【讨论】:

    【解决方案2】:

    只需使用set_include_path() 添加一次包含路径(在开头或配置文件中的某处),请参阅manual。使用绝对路径(不是相对路径;可以使用dirname(__FILE__)),它应该一直有效。

    【讨论】:

    • 拜托,你能告诉更多关于“非相对”的信息吗?对我来说,使用在配置文件中定义的包含路径的相对路径比在 include 或 require 指令的路径规范中使用变量更好。
    • 相对路径还可以,但它们可能会变得相当混乱,例如移动文件时,包括它们在其他地方,等等。
    【解决方案3】:

    如果您使用的是 PHP 5.3.0 或更高版本,您可以(而不是 RageZ 的建议)只使用 __DIR__(一个新定义的魔法常数)。

    示例:

    include __DIR__ . '/../include.php';
    

    现在,当您想避免 ../ 并映射您的包含时,这无济于事。不过,有一种更好的方法可以做到这一点 - 在所有前端文件(应该是唯一的用户可访问的 PHP 文件)中,您定义一个常量,它提供脚本的根路径(而不是当前文件的根路径)。

    例如:

    index.php

    <?php
    define('MYSCRIPT_ROOT', dirname(__FILE__));
    // or in php 5.3+ ...
    define('MYSCRIPT_ROOT', __DIR__);
    
    // ... do some stuff here
    
    include MYSCRIPT_ROOT . '/includes/myinclude.php';
    

    现在假设我们要在包含目录中包含一个文件。

    让我们在includes/myinclude.php 中进行,并包含文件includes/myotherinclude.php

    includes/myinclude.php

    <?php
    if(!defined('MYSCRIPT_ROOT')) exit; // prevent direct access - ALWAYS a good idea.
    
    // ... do stuff here or something
    
    include MYSCRIPT_ROOT . '/includes/myotherinclude.php';
    

    请记住,包含路径应​​直接相对于项目本身的 root 目录,而不仅仅是前端文件之一。如果子目录中有前端文件,定义常量时需要回退到项目根目录本身。

    示例:

    subdirectory/index.php

    index.php

    <?php
    define('MYSCRIPT_ROOT', dirname(dirname(__FILE__)));
    // or in php 5.3+ ...
    define('MYSCRIPT_ROOT', dirname(__DIR__));
    
    // ... do some stuff here
    
    include MYSCRIPT_ROOT . '/includes/myinclude.php';
    

    我们在这里所做的只是添加一个 dirname() 调用,它会在路径中删除一个目录。 见:http://us.php.net/manual/en/function.dirname.php

    【讨论】:

      【解决方案4】:

      任何路径问题的关键都叫做绝对路径

      • 在为您的网站(包括图片来源)创建超链接时,始终从/ 开始,后跟完整的正确路径。它永远不会让你失望。

      • 文件系统调用也一样:始终使用绝对路径。您的服务器通常会为您提供一个非常方便的变量,称为 $_SERVER['DOCUMENT_ROOT'] 包含文件系统与 Web 服务器的连接点,指向您的 Web 根目录。

      因此,当从您网站的任何位置调用时,

      include $_SERVER['DOCUMENT_ROOT'].'/scripts/php/index_mainImageJoin.php';
      

      总是指向同一个位置

      【讨论】:

      • 投反对票。 $_SERVER['DOCUMENT_ROOT'] 并不总是可用,因此不能依赖(IIS 不提供此变量)。如果有的话,您应该在前端文件中定义一个常量(输出为dirname(__FILE__)__DIR__),并在整个脚本、前端和后端文件中重用它。你不应该教授糟糕的和特定于环境的编程方法。
      • 并不意味着他们不应该首先采用这种方式处理它。最好鼓励他们以正确的方式学习,而不是偷工减料。无论如何,我已经用所有这些更新了我自己的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2015-05-10
      • 2014-11-15
      • 1970-01-01
      • 2014-04-24
      相关资源
      最近更新 更多