【问题标题】:Warning: Cannot modify header information - headers already sent by...header refresh, redirect [duplicate]警告:无法修改标头信息 - 标头已由...发送标头刷新,重定向 [重复]
【发布时间】:2012-07-21 20:45:14
【问题描述】:

可能重复:
Headers already sent by PHP

我在运行用户登录脚本后尝试重定向时收到此错误。

它试图在这一行更改标题数据:

header("Refresh: 2; url=index.php");

这是完整的 login.php 脚本。

<?php 
session_start();
require_once('init.php');

$username = trim($_POST['username']);
// create a new object
$login = new Auth($_POST, $dbh);

    if($login->validateLogin()){

        $_SESSION['loggedin'] = true;
        $_SESSION['username'] = $username;
        $list = $login->getUserInfo();
        $_SESSION['id'] = $list['id'];
        $_SESSION['thumb'] = $list['img_thumb'];

        echo '<div class="content">';
        echo '<h1>Thank you for logging in '.$username.'. Redirecting...</h1>';
        echo '</div>';
        header("Refresh: 2; url=index.php");

    }else{

        echo '<div class="content">';
        echo '<h1>Sorry but we didn\'t recognise those login details, please try again.</h1>';
        echo '</div>';

    }



require_once('inc/footer.inc.php');
?>

init.php 文件调用包含 html5 文档类型、元标记等的 header.php。

如何在用户登录后将用户重定向到索引页面并像往常一样发送标题信息?

【问题讨论】:

  • header('Location:index.php');
  • 我希望重定向延迟。另外,使用位置也会出现同样的错误。
  • Location 标头采用绝对 URI,而不是相对 URI(即使大多数浏览器都会出错)。
  • @crm — 良好的经验法则:要么在用户单击链接向前移动之前值得显示消息,要么根本不值得显示。

标签: php html header refresh


【解决方案1】:

使用 echo 然后尝试为 Location 设置标头总是会引发该错误。 ¿ 让用户知道重定向比重定向他们更好吗?如果你想显示这样的消息(如果它有效,这种方法不会显示它一秒钟),你应该使用 javascript 来更新内容并使用某种延迟......

...但也许工作量太大了。如果登录后显示欢迎信息,应该就足够了,对吧? :)

【讨论】:

    【解决方案2】:

    只需将 header() 调用移到任何 echo 语句之前:

    <?php
    /* ... */
    if($login->validateLogin()){
    
        $_SESSION['loggedin'] = true;
        $_SESSION['username'] = $username;
        $list = $login->getUserInfo();
        $_SESSION['id'] = $list['id'];
        $_SESSION['thumb'] = $list['img_thumb'];
    
        header("Refresh: 2; url=index.php"); // Put this *before* any output
        echo '<div class="content">';
        echo '<h1>Thank you for logging in '.$username.'. Redirecting...</h1>';
        echo '</div>';
    
    }else{
    
        echo '<div class="content">';
        echo '<h1>Sorry but we didn\'t recognise those login details, please try again.</h1>';
        echo '</div>';
    
    }
    /* ... */
    

    【讨论】:

      【解决方案3】:

      来自PHP docs

      请记住,必须在发送任何实际输出之前调用header(),无论是通过普通 HTML 标记、文件中的空白行还是通过 PHP。

      如果您希望页面在几秒钟后重定向,您需要使用Meta Refresh

      <meta http-equiv="refresh" content="5;URL='http://example.com/'">
      

      【讨论】:

        猜你喜欢
        • 2011-01-15
        • 2012-03-31
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2013-11-24
        • 2010-12-27
        相关资源
        最近更新 更多