2016-10-22 96 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'); 
發生