在从public_html中查找一个文件目录后,如何使用include引用回public_html根文件


How to refer back to public_html root file using include after going up one file directory out of public_html

基于一些特别有用的提示,我使用以下代码将PHP文件包含在根目录之外,看起来类似于以下文件:

define('WEB_ROOT', __DIR__);
define('APP_ROOT', dirname(__DIR__));
define('PHP_ROOT', APP_ROOT . DIRECTORY_SEPARATOR . 'application');

include(PHP_ROOT . DIRECTORY_SEPARATOR . 'bootstrap.php');

我的问题是,例如,您根据上面的内容包含代码bootstrap.php

如果PHP文件引导程序有自己的代码行,包括public_html根文件夹中的一个文件BACK,该怎么办。。。。如何编码?我在做这件事时遇到了一些困难,我的目标是我不想在代码中完全放入实际的文本目录,我想避免文件遍历攻击

考虑一下这个项目结构:

/路径/to/projectroot/index.php页眉包括/inc.php

如果index.php有

include('include/inc.php');

惠普公司有

include('header.php');

你会得到这个错误,因为inc.php中的行将寻找

/路径/to/projectroot/include/header.php(不存在)

不是

/路径/to/projectroot/header.php(确实存在)

人们有几种方法来解决这个问题。

1:绝对路径

第一个也是最直接的方法是使用绝对路径。

如果index.php有

include('include/inc.php');

惠普公司有

include('/path/to/projectroot/header.php');

这是可行的。

2:具有定义的绝对路径

类似于#1,如果index.php有

define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');

惠普公司有

include(PROJECT_ROOT.'header.php');

这是可行的。

更新:正如pichan在评论中所指出的,您可以在index.php中使用其中一个"神奇"常量,因此:

index.php

define('PROJECT_ROOT', __DIR__.'/');
include(PROJECT_ROOT.'include/inc.php');

和inc.php

include(PROJECT_ROOT.'header.php');

注意,我们在__DIR__中添加了一个尾部斜线,因为:

除非是根目录,否则此目录名没有尾部斜杠。

3:同时包含和隐藏错误

如果inc.php有

@include('header.php');    # Try this directory
@include('../header.php'); # Try parent directory

这是可行的。[1]

4:假设当前目录,除非另有规定

如果index.php有

$rel_prefix_to_root = '../';
include('include/inc.php');

惠普公司有

if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; }
include($rel_path_to_root . 'header.php');

这是可行的。

我对这些方法的看法

1和2基本上是相同的,但2更容易一些,在大型项目中更常见,因为它允许您进行一个常量定义并在整个站点范围内使用它。它还允许您在多个服务器上部署项目(放置在多个路径中),并且只需要在项目范围内更改一行,而选项1在每个文件中更改一行。

3太可怕了,不要这么做。有时你会看到它,你甚至可能在网上教程中看到它。不要这么做。

4可能应该避免,而选择1或2。但是,如果您有一些复杂的include集,那么这种方法可能是必要的。

一些注意事项:

[1] 这是个糟糕的主意。它有效,但不要这样做。

要获得public_html上面的目录,我使用以下命令
$aboveRoot=爆炸('/public_html',$_SERVER['DOCUMENT_ROOT'])
define('ABOVE_THE_ROOT',$aboveRoot[0]);