【问题标题】:headers_sent returns always true. Cannot redirect [duplicate]headers_sent 始终返回 true。无法重定向[重复]
【发布时间】:2016-01-11 23:38:09
【问题描述】:

我已经创建了一个登录页面和一个登录页面。登录页面的PHP代码为:

<?php
  session_start();
  include 'functions.php';
  if(isValid()){
    header('Location: logged.php');
    exit;
  }
?>

记录页面的代码是:

<?php
  session_start();
  include 'functions.php';
  if(!isValid()){
    header('Location: login.php');
    exit;
  }
?>

在此代码之前没有任何内容。在代码之后,login.php 页面中有登录表单,logged.php 页面中有一些信息。

isValid() 函数是正确的,因为我已经使用 isvalid.php 页面对其进行了测试,当用户正确登录时返回 1,如果没有用户登录或会话中保存的信息错误则返回 0。

如果我使用 login.php 页面中的表单登录,我可以在 logged.php 页面中看到所有信息。如果我尝试返回 login.php,我将被重定向到 logged.php。

如果我没有登录并且我尝试访问logged.php,输出是一个空白页面,没有任何重定向到login.php 页面。 PHP 应该将我重定向到登录页面!

我在另一个讨论中看到建议调试是否有带有 headers_sent() 函数的输出。

当我放这样的调试代码时

<?php
  if(headers_sent())
    echo "TRUE";

在第一行,它在登录页面中返回 TRUE,在登录页面中没有任何内容。

有什么问题?

【问题讨论】:

  • 尝试一次不包含函数。或者删除functions.php中的任何?&gt;。之后的任何空格或换行符都将被视为输出,因此标题(对于该 output9 已经发送。

标签: php redirect login header


【解决方案1】:

详细说明 Fraceskix 评论:

脚本中标签之外的任何内容都被视为输出,因此会导致发送标头。

此外,一些文本编辑器会自动在末尾添加换行符。例如,vim 就像 outlined here 那样做。这意味着,如果您有一个包含 php 结束标记的包含文件,则它可能正在发送内容,因此是标题。

解决这个问题的最简单方法是不要关闭仅包含 php.ini 的文件中的 php 标签。其实这是part of the psr-2 standard for this reason

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 2019-10-29
    • 2021-07-11
    • 2021-03-05
    • 2014-06-25
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多