所以我正在创建一个包含在每个页面上的PHP配置文件。在其中,它会检查用户的访问级别,如果是某个值,则会将用户重定向到某个页面。对于此访问级别,他们只能访问一个页面,因此在测试时,我将用户重定向到他们当前所在的同一页面。当我在chrome dev工具中查看网络时,它会显示取消GET
请求。这是正确的行为吗?或者它应该重新加载页面?看起来有点像这样:
<?php
//set globals
$contractedUser = 1;
$isContractor = false;
$dr = $_SERVER['DOCUMENT_ROOT'];
//Get the page user is trying to load
$backtrace = debug_backtrace();
$referrerPathArray = explode('\\',$backtrace[0]['file']);
$lastElementIndex = sizeof($referrerPathArray) - 1;
$referrerPage = $referrerPathArray[$lastElementIndex];
//Get user data
$user = User::getUser();
//validate user's login, redirect to login if not
if (!$user) {
$page = 'http' . (empty($_SERVER['HTTPS']) ? '' : 's') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header("Location:$dr/Admin?r=" . $page);
die();
}
if ($user->getAccess() == $contractedUser) {
$isContractor = true;
$pin = $user->getPin();
}
if ($isContractor && ($referrerPage != 'CreateMenuEntry.php' && $referrerPage != 'CreateMenu.php')){
header("Location: $dr/Admin/CreateMenuEntry.php");
}
else{
echo $dr.'/Admin/CreateMenuEntry';
echo $referrerPage;
}
更新:
Jeroen帮助我弄清楚我的问题是在标题中使用$_SERVER['DOCUMENT_ROOT']
。我将其更改为$_SERVER['HTTP_HOST'] . "Admin/CreateMenuEntry.php"
,现在正在使用。
答案 0 :(得分:1)
它看起来像一个重定向循环,但后来我们的评论&amp;跟进聊天很清楚,问题在于重定向本身。
当您使用标题(“位置:.....”)进行重定向时,您告诉用户的浏览器去某个地方。因此,这需要是有效的公共URL,或者是相对于文档根目录的有效路径。
现在,对于浏览器,文档根目录为http://www.example.com - 因此,如果您重定向到/info.php,用户将被重定向到http://www.example.com/info.php。
但对于您的服务器,文档根目的意味着其他东西,它是服务器上的绝对路径。所以假设你的网站是默认的/ var / www。如果您将用户重定向到$ _SERVER ['DOCUMENT_ROOT']。 '/info.php',您实际上是将它们重定向到:http://www.example.com/var/www/info.php - 当然不存在。
因此,当您想要包含公共文件夹中的PHP文件服务器端时,您可以使用例如:include($ _ SERVER ['DOCUMENT_ROOT']。'/ info.php')。但是,当您告诉浏览器重定向时,您必须从浏览器的角度看它,并使用公共地址(您的URL)或相对于URL的路径 - 所以'http://www.example.com/info.php'或'/ info .PHP'