2016-10-22 50 views
1

在我的项目中,PHP中的文件检查身份验证。从不同路径深度重定向

$ PROJECT_ROOT/lib中/ functions.php中:

<?php 
check_authentication(); 

function check_authentication(){ 
     if (session_status() == PHP_SESSION_NONE) { 
      session_start(); 
     } 

     if(defined('authorized') && authorized){ 
       if(!(isset($_SESSION['admin'] && $_SESSION['admin']))){ 
        header('Location: login.php'); 
        exit(0); 
       } 
     } 
} 

的check_authentication功能检查用户是否已经验证,如果没有它重定向到$ PROJECT_ROOT/login.php中的页面。

在文件$ PROJECT_ROOT/reader.php:

<?php 
define('authorized',TRUE); 

require_once('lib/functions.php'); 

这工作OK!

然而,在文件$ PROJECT_ROOT /模块/ text.php:

<?php 
define('authorized',TRUE); 

require_once('../lib/functions.php'); 

这是不正确的重定向,因为它是不位于$ PROJECT_ROOT目录

this question我知道无法获取“functions.php”的URI文件夹。

但是,我能做些什么来解决这个问题?

显然我可以尝试重定向绝对路径,但这会损害我的项目的可移植性。

回答

0

问题是无法通过PHP轻松引用$ PROJECT_ROOT URL。

所需要的是建立项目URL抽象相对于$ _ SERVER [ 'DOCUMENT_ROOT']

这可以在$ PROJECT_ROOT/lib目录/ functions.php文件来实现:

define(PROJECT_URL, 
     '//'.$_SERVER['HTTP_HOST']. 
     substr(dirname(__DIR__), strlen($_SERVER['DOCUMENT_ROOT'])) 
); 

出发'//'创建http/https协议抽象。

上述URL被从这些元件构成:

echo __DIR__; // /var/www/html/project_x/service/lib (current script directory) 
echo '<br>'; 
echo dirname(__DIR__); // /var/www/html/project_x/service (the data model root directory in this case) 
echo '<br>'; 
echo $_SERVER['DOCUMENT_ROOT']; // /var/www/html (prefix that need to be removed) 
echo '<br>'; 
echo PROJECT_URL; // //localhost/project_x/service 

重定向现在将与绝对URL

header('Location: '.PROJECT_URL.'/login.php'); 
发生