-1

可能重复:
PHP 已发送的标头

我有一个用于检查用户名和密码的 PHP 文件。这部分工作正常,但成功登录后我想header()用来重定向到用户面板页面。这是我收到的记录错误:

[2012 年 12 月 10 日 12:25:26] PHP 警告:无法修改标头信息 - 标头已由 /home2/jzperson 中的(输出开始于 /home2/jzperson/public_html/imes/php/login.php:10)发送/public_html/imes/php/login.php 在第 32 行

这是第 10 行:

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>

这是第 32 行:

header("Location: http://imes.jzpersonal.com/userpanel.html");

知道为什么吗?

4

5 回答 5

3

header在您的呼叫到达第 32 行之前,您可能已经回显了一些输出。

header函数说明:http: //php.net/manual/en/function.header.php

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。使用 include 或 require 函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。

澄清

为了澄清一点,重定向使用header()是通过在服务器响应中包含一个原始位置响应头字段来执行的。当接收方读取响应并看到该标头字段时,它会丢弃当前响应并向您提供的目的地发出另一个请求。

现在,标头始终位于服务器响应的顶部(头部)。这就是为什么它们被称为标题!如果您输出任何内容,PHP 将立即使用默认标题“为其添加前缀”,并且在此之后无法再添加任何内容。因此,稍后通过尝试在代码中设置另一个标头,您会收到错误:

无法修改标头信息 -标头已发送

通过在第 10 行输出 HTML,您不能再发出任何标题,因为它们已经发送(作为 HTML 输出的前缀)。

您可以在此处找到有关标头的更多信息:http: //www.faqs.org/rfcs/rfc2616.html

于 2012-12-10T19:35:23.740 回答
2

基本上,在将任何内容发送到浏览器之前(在 HTML 之前),您需要检查用户是否登录(并重定向)。那么,您的代码将如下所示:

<?php
...
if($loggedIn)
{
    header("Location: http://imes.jzpersonal.com/userpanel.html");
    exit();
}
?>
<html>
...
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
于 2012-12-10T19:35:44.080 回答
1

您正在尝试在标题语句之前写一些东西 在标题语句之前删除任何回显语句/html 内容。这应该够了吧

于 2012-12-10T19:37:16.640 回答
1

你也可以作弊,只使用输出缓冲——在脚本树的最开始使用 ob_start(); 开始捕获输出。您可以随心所欲地使用标题和设置 cookie 等。

在脚本树的最后一行使用 ob_end_flush(); 发送输出。如果您愿意,也可以使用 $buffer = ob_get_clean(); 将其抓取到变量中以进一步处理。

虽然它不是这样的解决方案,但它确实允许更灵活的编码环境,并且它将解决您的上述问题。

如果要发送 Location 标头,最好刷新并死掉:ob_start(); /* 很长的片段 */ header('Location: somepage.php'); ob_end_flush(); 死();

这将防止在发送位置更改后进行任何进一步的处理。

顺便说一句:当我谈到脚本树时,我指的是包含路径——比如把 ob_start(); 放入一个包含在其他任何内容之前的头文件和一个刷新(并在需要时处理)输出缓冲区的页脚文件。请记住,如上所述,位置更改后应该立即停止脚本。

会话可能还需要用一个标头 Location 后跟一个 die 来关闭 - 简单地使用它

ob_start();
/* very long snip */
header('Location: somepage.php');
ob_end_flush();
session_write_close();
die();

我在想知道为什么会话数据丢失了几个小时后发现了一个!请记住这一点。

于 2012-12-10T20:57:08.860 回答
0

header();如果已经将任何内容作为输出发送,则不能使用。这意味着 HTML。首先进行所有 PHP 处理,然后输出 HTML/JS。

于 2012-12-10T19:35:36.410 回答