114

你如何包含一个超过 2 个目录的文件。我知道您可以使用../index.php包含 2 个目录的文件,但是您如何为 3 个目录执行此操作?这有意义吗?我试过.../index.php了,但它不起作用。

我有一个文件/game/forum/files/index.php,它使用 PHP 包含来包含一个文件。位于/includes/boot.inc.php/作为根目录。

4

19 回答 19

175

..从当前目录中选择父目录。当然,这可以链接:

../../index.php

这将是两个目录。

于 2008-10-02T15:10:07.637 回答
53

要将文件包含在一个目录后面,请使用'../file'. 对于两个目录,使用'../../file'. 等等。

虽然,实际上您不应该执行相对于当前目录的包含。如果你想移动那个文件怎么办?所有的链接都会中断。一种确保您仍然可以链接到其他文件,同时在移动文件时保留这些链接的方法是:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT是一个服务器变量,表示您的代码所在的基本目录。

于 2008-10-02T15:14:17.003 回答
31
. = current directory
.. = parent directory

所以../让你回到一个目录而不是两个

../根据需要进行多次连锁以提升 2 级或更多级别。

于 2008-10-02T15:12:13.933 回答
23
include dirname(__FILE__).'/../../index.php';

是您最好的选择,它将避免您在其他解决方案中可能遇到的大多数相对路径错误。

实际上,它将强制包含始终相对于放置此代码的当前脚本的位置(该位置很可能是稳定的,因为您定义了应用程序的体系结构)。这与仅include '../../index.php' 包含相对于执行(也称为“调用”)脚本然后相对于当前工作目录的操作不同,后者将指向包含您的脚本的父脚本,而不是从您包含的脚本的路径中解析.

来自 PHP 文档:

根据给定的文件路径包含文件,如果没有给出,则根据指定的 include_path 包含文件。如果在 include_path 中找不到该文件,则 include 最终会在失败之前检查调用脚本自己的目录和当前工作目录。

我发现引用这个技巧的最古老的帖子可以追溯到 2003 年,由 Tapken 撰写

您可以使用以下设置进行测试:

创建这样的布局:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

parent.php中,输入:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

sub/included.php中,输入:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

访问时的结果parent.php

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

正如我们所看到的,在第一种情况下,路径是从调用脚本中解析出来的parent.php,而通过使用dirname(__FILE__).'/path'技巧,包含是从included.php放置代码的脚本中完成的。

请注意,以下内容不等同于上述技巧,与其他地方可以阅读的相反:

include '/../../index.php';

确实,前置/会起作用,但它会像include ../../index.php调用脚本一样解决(不同之处在于,include_path如果它失败,则不会在之后查看)。来自 PHP 文档

如果定义了路径——无论是绝对路径(在 Windows 上以驱动器号或 \ 开头,或在 Unix/Linux 系统上以 / 开头)还是相对于当前目录(以 . 或 .. 开头)—— include_path 将被完全忽略。

于 2012-08-23T15:29:17.760 回答
16

../是一个目录,重复两个目录../../甚至三个:../../../等等。

定义常量可能会减少混淆,因为您将向前钻取目录而不是向后钻取

您可以像这样定义一些常量:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

当使用“BD”或我的“基本目录”时,它看起来像这样:

file(BD.'location/of/file.php');

定义(); 参考

于 2012-08-14T13:57:08.553 回答
15
../../index.php 

       

于 2008-10-02T15:09:51.803 回答
12
../../../includes/boot.inc.php

每个实例../意味着上/后一个目录。

于 2008-10-02T15:10:54.763 回答
9

以下是访问不同目录的方法:-

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
于 2013-11-13T05:51:14.947 回答
9

尝试这个

这个例子是一个目录

require_once('../images/yourimg.png');

这个例子是两个目录后面

require_once('../../images/yourimg.png');
于 2019-04-03T06:51:41.753 回答
7

你可以这样做../../directory/file.txt- 这会返回两个目录。

../../../- 这是三个。ETC

于 2008-10-02T15:10:05.560 回答
7
../../../index.php

         

于 2008-10-02T15:10:38.120 回答
7

我建议使用__DIR__指定当前 php 文件目录。检查这里的原因。

__DIR__ . /../../index.php
于 2017-05-11T14:02:37.980 回答
7

如果您使用的是 php7,则可以使用 level 参数为 2 的 dirname 函数,例如:

dirname("/usr/local/lib", 2);

第二个参数“2”表示上多少级

目录名参考

于 2016-12-06T06:34:33.027 回答
6

但是要非常小心让用户选择文件。你真的不想让他们得到一个文件,例如,

../../../../../../../../../../etc/passwd

或其他敏感的系统文件。

(对不起,自从我成为 linux 系统管理员以来已经有一段时间了,我认为这是一个敏感文件,据我所知)

于 2008-10-02T15:13:17.147 回答
5
../../../includes/boot.inc.php
于 2008-10-02T15:10:07.183 回答
3

包括目录可以由代理文件处理

  • .....|__网络
  • .....|.........|_requiredDbSettings.php
  • .....|
  • .....|___分贝
  • .....|.........|_dbsettings.php
  • .....|
  • .....|_proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';
    
于 2014-04-10T21:07:06.280 回答
2

如果您在包含/的开头包含 ,则包含将被视为站点根目录的路径。

如果您的网站是http://www.example.com/game/forum/files/index.php您可以添加一个包含到 /includes/boot.inc.php 将解析为http://www.example.com /includes/boot.inc.php

您必须小心..遍历,因为某些 Web 服务器已禁用它;当您想将站点移动到新机器/主机并且结构略有不同时,它也会导致问题。

于 2008-10-02T15:15:58.153 回答
2

试试../../。您可以相应地对其进行修改,因为它将带您返回两个目录。首先到达根目录,然后访问所需的目录。

例如,您在root/inc/usr/ap其中并且有另一个目录root/2nd/path。您可以像这样访问该path目录ap../../2nd/path首先转到根目录而不是所需目录。如果不工作,请分享。

于 2012-09-15T13:04:48.343 回答
1

我看到了你的答案,我使用了包含语法的路径

require_once '../file.php'; // server internal error 500

和 http 服务器 (Apache 2.4.3) 返回内部错误 500。

当我将路径更改为

require_once '/../file.php'; // OK

一切都很好。

于 2012-09-05T20:57:45.573 回答