PHP - 无法修改标头信息

时间:2010-12-24 06:47:42

标签: php header

我对这个错误感到很疯狂:无法修改标题信息 - 已经由...发送的标题

请注意,我知道谷歌和堆栈溢出的大量结果。我的问题是我构建页面的方式。为了使html与php分开,我使用包含文件。因此,例如,我的页面看起来像这样:

<?php 
require_once('web.config.php'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login</title>
<link rel="shortcut icon" href="images/favicon.gif"/>
<link rel="shortcut icon" href="images/favicon.ico"/>
<link rel="stylesheet" type="text/css" href="<?php echo SITE_STYLE; ?>"/>
</head>
<body>
<div id="page_effect" style="display:none;">
<?php require_once('./controls/login/login.control.php'); ?>
</div>
</body>
</html>

因此,当我的php文件被包含时,标题已经发送。

包含文件的一部分如下所示:

// redirect to destination
if($user_redirect != 'default')
{
    header('Location:'.$user_redirect);
}
elseif($user_redirect == 'default' && isset($_GET['ReturnURL']))
{
    $destination_url = $_GET['ReturnURL'];
    header('Location:'.$destination_url);
}
else
{
    header('Location:'.SITE_URL.'login.php');
}

但我无法弄清楚如何解决这个问题。我不能在输出之前重定向头,因此只有输出缓冲是我能做的。当然,它的工作方式很好 - 但不得不依赖它才会发臭。

如果PHP有另一种重定向方法或者有其他参数来告诉它清除缓冲区,那将是很好的。

3 个答案:

答案 0 :(得分:2)

关键不是将PHP与HTML分开,而是将Presentation与Processing分开。基于应用程序状态的重定向是处理的一部分。先做。

答案 1 :(得分:1)

就像你说的那样,问题在于你如何构建网页。

在输出页面之前,您应该处理身份验证逻辑(和其他人)。无论如何,这样可以提高安全性。

正如您现在也可能知道的那样,您不应该依赖输出缓冲,因为缓冲区的大小可能会发生变化,您登录前的内容会因模板而改变,即使启用了输出缓冲也会导致不可靠的行为

答案 2 :(得分:1)

header语句之前是否有任何echo / print语句?这可能会导致此错误。

相关问题