你如何包含一个超过 2 个目录的文件。我知道您可以使用../index.php
包含 2 个目录的文件,但是您如何为 3 个目录执行此操作?这有意义吗?我试过.../index.php
了,但它不起作用。
我有一个文件/game/forum/files/index.php
,它使用 PHP 包含来包含一个文件。位于/includes/boot.inc.php
;/
作为根目录。
你如何包含一个超过 2 个目录的文件。我知道您可以使用../index.php
包含 2 个目录的文件,但是您如何为 3 个目录执行此操作?这有意义吗?我试过.../index.php
了,但它不起作用。
我有一个文件/game/forum/files/index.php
,它使用 PHP 包含来包含一个文件。位于/includes/boot.inc.php
;/
作为根目录。
..
从当前目录中选择父目录。当然,这可以链接:
../../index.php
这将是两个目录。
要将文件包含在一个目录后面,请使用'../file'
. 对于两个目录,使用'../../file'
. 等等。
虽然,实际上您不应该执行相对于当前目录的包含。如果你想移动那个文件怎么办?所有的链接都会中断。一种确保您仍然可以链接到其他文件,同时在移动文件时保留这些链接的方法是:
require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');
DOCUMENT_ROOT
是一个服务器变量,表示您的代码所在的基本目录。
. = current directory
.. = parent directory
所以../
让你回到一个目录而不是两个。
../
根据需要进行多次连锁以提升 2 级或更多级别。
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 将被完全忽略。
../
是一个目录,重复两个目录../../
甚至三个:../../../
等等。
定义常量可能会减少混淆,因为您将向前钻取目录而不是向后钻取
您可以像这样定义一些常量:
define('BD', '/home/user/public_html/example/');
define('HTMLBD', 'http://example.com/');
当使用“BD”或我的“基本目录”时,它看起来像这样:
file(BD.'location/of/file.php');
../../index.php
../../../includes/boot.inc.php
每个实例../
意味着上/后一个目录。
以下是访问不同目录的方法:-
./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
尝试这个
这个例子是一个目录
require_once('../images/yourimg.png');
这个例子是两个目录后面
require_once('../../images/yourimg.png');
你可以这样做../../directory/file.txt
- 这会返回两个目录。
../../../
- 这是三个。ETC
../../../index.php
我建议使用__DIR__
指定当前 php 文件目录。检查这里的原因。
__DIR__ . /../../index.php
但是要非常小心让用户选择文件。你真的不想让他们得到一个文件,例如,
../../../../../../../../../../etc/passwd
或其他敏感的系统文件。
(对不起,自从我成为 linux 系统管理员以来已经有一段时间了,我认为这是一个敏感文件,据我所知)
../../../includes/boot.inc.php
包括目录可以由代理文件处理
.....|_proxy.php
dbsettings.php:
$host='localhost';
$user='username':
$pass='pass';
proxy.php:
include_once 'db/dbsettings.php
requiredDbSettings.php:
include_once './../proxy.php';
如果您在包含/
的开头包含 ,则包含将被视为站点根目录的路径。
如果您的网站是http://www.example.com/game/forum/files/index.php您可以添加一个包含到 /includes/boot.inc.php 将解析为http://www.example.com /includes/boot.inc.php。
您必须小心..
遍历,因为某些 Web 服务器已禁用它;当您想将站点移动到新机器/主机并且结构略有不同时,它也会导致问题。
试试../../
。您可以相应地对其进行修改,因为它将带您返回两个目录。首先到达根目录,然后访问所需的目录。
例如,您在root/inc/usr/ap
其中并且有另一个目录root/2nd/path
。您可以像这样访问该path
目录ap
:
../../2nd/path
首先转到根目录而不是所需目录。如果不工作,请分享。
我看到了你的答案,我使用了包含语法的路径
require_once '../file.php'; // server internal error 500
和 http 服务器 (Apache 2.4.3) 返回内部错误 500。
当我将路径更改为
require_once '/../file.php'; // OK
一切都很好。