从不同路径深度重定向
问题描述:
在我的项目中,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文件夹。
但是,我能做些什么来解决这个问题?
显然我可以尝试重定向绝对路径,但这会损害我的项目的可移植性。
答
问题是无法通过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');
发生