如何将文件包含在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.php
parsing出来的,而通过使用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