基于一些非常有用的技巧,我使用下面的代码包含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根文件夹中的文件行....怎么会一个代码是什么? 我有一些困难,这样一来,在这里我的目标是,我不希望把实际的字面目录全部代码和我想避免文件遍历攻击
考虑这个项目的结构:
/path/to/projectroot/index.php
header.php
include/inc.php
如果过的index.php
include('include/inc.php');
和inc.php有
include('header.php');
你会得到这个错误,因为在inc.php行要寻找
/path/to/projectroot/include/header.php (doesn't exist)
不
/path/to/projectroot/header.php (does exist)
有几个方式让人们解决这个问题。
1:绝对路径
首先,也是最直接的方式是使用绝对路径。
如果过的index.php
include('include/inc.php');
和inc.php有
include('/path/to/projectroot/header.php');
这会工作。
2:与定义绝对路径
类似#1,如果有的index.php
define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');
和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');
和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。但是,如果你有一些复杂的设置包括这种方法可能是必要的。
一些注意事项:
[1]这是一种可怕的想法。 它的工作原理,但不这样做。
为了获得上述的public_html目录我用下面的
$ aboveRoot =爆炸( '/的public_html',$ _SERVER [ 'DOCUMENT_ROOT']);
定义( 'ABOVE_THE_ROOT',$ aboveRoot [0]);
文章来源: How to refer back to public_html root file using include after going up one file directory out of public_html