PHP输出缓冲和标头位置
在我们的一台服务器上有一个非常旧的php身份验证脚本,如下所示:PHP输出缓冲和标头位置,php,authentication,ms-access,output-buffering,Php,Authentication,Ms Access,Output Buffering,在我们的一台服务器上有一个非常旧的php身份验证脚本,如下所示: ob_start(); $log = new Auth(); // returns true $checkSession = $log->checkLog(); if(!$checkSession){ header("Location: ../index.php"); exit(); }else{ include "content/".$_GET["content"].".php";
ob_start();
$log = new Auth();
// returns true
$checkSession = $log->checkLog();
if(!$checkSession){
header("Location: ../index.php");
exit();
}else{
include "content/".$_GET["content"].".php";
}
$content = ob_get_contents();
ob_end_clean();
include "../".WEBROOT_TEMPLATE_FILE;
它总是工作顺利,通过身份验证的用户能够访问该页面,未经身份验证的用户被重定向到主页。。。直到今天
由于一些完全未知的原因,当用户试图从access 2000数据库生成的链接访问其中一个服务器页面时,他们总是被重定向到index.php
奇怪的是,当将url直接粘贴到浏览器中时,它工作正常。
url完全相同,$\u服务器变量在这两种情况下也是相同的。我甚至检查了同样相同的HTTP头
此外,如果我对重定向进行注释,它也会起作用:
if(!$checkSession){
//header("Location: ../index.php");
//exit();
}else{
// that part is executed
include "content/".$_GET["content"].".php";
}
有人在这里遇到了同样的问题,但遗憾的是没有得到任何有效的答案:
有什么想法吗
提前感谢您的帮助
编辑:找到解决方案
出于某种原因,apache服务器不喜欢access 2000数据库生成的http请求,并发出了一个带有修改头的新请求,尤其是http accept。。。遗憾的是,第一个请求没有初始化任何会话。。。因此重定向到index.php
因此,对我来说,丑陋但有效的解决方案是:
if($_SERVER['HTTP_ACCEPT']!="*/*"){
// Do your stuff
}
试试这个:
header("Location: http://site.com/index.php");
正如@MonkeyMonkey所说的,这很可能与头文件/cookie已经发送有关,并且当脚本到达会话身份验证和重定向时,它无法重新发送它们 这将产生一个警告:如果您将错误报告设置为E_ALL,则标题已发送 现在,关于产出的起点,这一点很难确定。实际上,在ob_开始之前包含的任何文件都可能在结束之后的结尾处有空格/制表符/换行符。在ob_开始之后添加此选项: 在此之后,检查$\u SESSION[]中的任何变量(如果已设置且具有任何值):
if(!isset($_SESSION['username']) || $_SESSION['username'] == "") {
header("Location: ../index.php"); //redirect unauthorized users
exit();
}
else {
// your code
}
注意:以上代码只是一个示例,请在使用前根据您的需要进行更改。我们无法解决您的编码问题,我们不知道具体实现。启用错误报告/显示错误并启动调试。我看没有别的办法了……这一点都没有改变。我不知道这和我的问题有什么关系,不过还是要谢谢你。
if(!isset($_SESSION['username']) || $_SESSION['username'] == "") {
header("Location: ../index.php"); //redirect unauthorized users
exit();
}
else {
// your code
}