如何将文件包含在2个目录中?

如何包含一个超过2个目录的文件。 我知道你可以使用../index.php来包含一个2个目录的文件,但是你怎么做3个目录呢? 这有道理吗? 我试过.../index.php但它不工作。

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

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

 ../../index.php 

这将是两个目录。

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

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

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

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

 . = current directory .. = parent directory 

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

连锁../必要的次数上升2个或更多的水平。

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

定义常量可能会减less混淆,因为您将向前钻入目录

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

 define('BD', '/home/user/public_html/example/'); define('HTMLBD', 'http://example.com/'); 

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

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

定义(); 参考

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

这里是你最好的select,它将避免大部分你可能遇到的其他解决scheme的相对path错误。

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

从PHP文档:

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

我发现引用这个技巧的最古老的post可以追溯到2003年,Tapken 。

您可以使用以下设置进行testing:

创build一个这样的布局:

 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 

正如我们所看到的,在第一种情况下,path是从调用脚本parent.phpparsing出来的,而通过使用dirname(__FILE__).'/path'技巧,include是通过脚本included.php完成的,被放置在。

要小心,以下不等同于上面的伎俩与其他地方可以读的相反:

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

事实上,prepending /将工作,但它将像调用脚本中include ../../index.php一样解决(不同之处在于如果失败, include_path将不会被查看)。 从PHP文档 :

如果定义了一个path – 无论是绝对path(在Windows上是开始,还是在Windows上,或者在Unix / Linux系统上开始),还是相对于当前目录(以。或..开头),include_path都将被忽略。

 ../../index.php 

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

 ./ = Your current directory ../ = One directory lower ../../ = Two directories lower ../../../ = Three directories lower 
 ../../../includes/boot.inc.php 

../每个实例表示上/下一个目录。

你可以做../../directory/file.txt – 这回两个目录。

../../../ – 这是三个。 等等

 ../../../index.php 

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

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

或其他敏感的系统文件。

(对不起,我已经有一段时间了,因为我是一个linux系统pipe理员,我认为这是一个敏感的文件,从我记得)

 ../../../includes/boot.inc.php 

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

例如,您在root/inc/usr/ap并且存在另一个目录root/2nd/path 。 你可以从ap访问path目录,如下所示: ../../2nd/path首先转到所需目录的根目录。 如果不工作,请分享。

如果你在包含的开始处包含/,包含将被视为站点根目录的path。

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

你必须小心使用遍历,因为一些Web服务器已经禁用它; 当你想把你的站点移动到一台新的机器/主机时,它也会引起问题,结构有点不同。

包括通过目录可以被代理文件处理

  • ….. | __web
  • ….. | ……… | _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'; 

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

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

第二个参数“2”表示多less级别

dirname参与

我看到了你的答案,我用包含语法的path

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

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

当我改变path

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

一切安好。

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

 __DIR__ . /../../index.php