【问题标题】:Why is the server mysteriously sending headers after page load?为什么服务器在页面加载后神秘地发送标头?
【发布时间】:2019-10-21 23:58:54
【问题描述】:

由于某些奇怪的原因,以下代码在条件为真时可以正常工作。我想知道为什么,与the expected error 相反,它有效

include('includes/header.html');
echo "<div class = 'col-sm-6'>";
if (!ISADMIN && !(isset($_SESSION['id']) && isset($_GET['id']) && $_SESSION['id'] == $_GET['id'])) {
  @require('includes/login_functions.inc.php');     
  redirect_user(''); // Redirects successfully
}

上面的函数redirect_user() 位于一个包含文件中,我在大部分PHP 文件的顶部调用该函数。主要是函数调用

header("Location: $url")

其中 $url 是一个局部函数作用域变量。

标头已经发送,HTML 已经通过 PHP 动态和通过 HTML 静态打印到页面。但是,根据条件,如果条件返回 true,用户仍会被重定向。这是一个问题的原因是当我尝试在一个新文件中重现它时,我得到了我期望的错误,

警告:无法修改标头信息 - 标头已发送(输出开始于

此外,我在没有条件的情况下按预期收到此错误,只需调用redirect_user()

includes 目录位于存储库的GitHub 上。直播网站上的页面是http://www.bforborum.com/test

编辑

我发现 output_buffering 已打开,我将其关闭无济于事。将此设置为 0,无论是否发送标头,所有内容都会重定向。

【问题讨论】:

  • 你是说有时调用header() 会抛出警告,有时却不会?您担心没有发出警告的情况,对吗?
  • >> 此外,我在没有条件的情况下收到此错误,只需调用 redirect_user()。那么,当它进入您的 if 语句时,会引发错误吗?如果是这样,那正是应该发生的事情。您已经使用echo 输出了内容,因此任何对header(...) 的调用都会引发该警告。
  • @waterloomatt 在我制作的第一个脚本中,没有抛出警告。在我尝试重现此内容时制作的第二个脚本中,它会引发警告。
  • @waterloomatt 我知道为什么它会抛出错误......当它不是时我很困惑
  • 我怀疑它不会进入您的 if 语句,因此不会发出标题。您的 if 语句逻辑似乎自相矛盾。如果!session['id'] &amp;&amp; get['id']session['id'] == get['id'] 怎么可能?希望这很清楚。

标签: php http-headers


【解决方案1】:

注意: 我自己没有找到这个答案。 waterloomatt 帮助了我,但当时问题已关闭。

所有这一切的原因是output_buffering 在实时站点上打开,而在本地主机上关闭。或者,display_errors 在实时站点上关闭,同时在 localhost 上打开。这导致了不一致的结果。

输出缓冲意味着即使标头已经发送,它也会重定向。我使用.htaccess 将实时站点和localhostoutput_buffering 设置为关闭。此外,我使用 ob_start 是因为以这种方式使用它实际上对我来说效果更好。

What's the use of ob_start() in php?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2011-02-21
    • 2023-03-08
    • 2011-06-02
    • 2015-07-01
    • 2017-07-02
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多