警告:无法修改标头信息-php 301重定向的标头已经发送


Warning: Cannot modify header information - headers already sent by for php 301 redirection

我已经从php创建了301重定向。以下是我重定向url的代码。

$current_url = substr($redirect_url, 11);
$sqlr = "SELECT old_url, new_url FROM cscart_301_redirection WHERE old_url  = '$current_url' ";
$resultr = mysql_query($sqlr);
$rowr = mysql_fetch_array($resultr);
$newurl = $rowr['new_url'];
if(mysql_num_rows($resultr)>0)
{
    header ('HTTP/1.1 301 Moved Permanently');
    header ('Location: '.$host.$newurl);
} 

但当代码在实时服务器上运行时,我会得到

警告:无法修改标头信息-标头已由发送这个错误。请告诉我哪里做错了?

感谢

"headers already sended"错误通常是由打开和关闭PHP标记(<?php . . . ?>)之前或之后有空白引起的

通过在if条件中编写ob_start()来尝试以下代码。ob_start()方法将打开输出缓冲。当输出缓冲处于活动状态时,脚本不会发送任何输出(除了标头),而是将输出存储在内部缓冲区中。

$current_url = substr($redirect_url, 11);
$sqlr = "SELECT old_url, new_url FROM cscart_301_redirection WHERE old_url  = '$current_url' ";
$resultr = mysql_query($sqlr);
$rowr = mysql_fetch_array($resultr);
$newurl = $rowr['new_url'];
if(mysql_num_rows($resultr)>0)
{
    ob_start();
    header ('HTTP/1.1 301 Moved Permanently');
    header ('Location: '.$host.$newurl);
    die;
} 
警告:无法修改标头信息-标头已由(输出发送,在/home/indianet/public_html/var/compiled/customer/%45^45E^45E480CD%%index.tpl.ph启动‌​p: 9),位于/home/indianet/public_html/var/compiled/customer/%%FD^FD1^FD153A02%%top.tpl.php第32行

在执行top.tpl.php中第32行的头函数之前,脚本中第9行的%%45^45E^45E480CD%%index.tpl.ph‌​p输出被发送到客户端。

http响应看起来像

header1
header2
header3
<--empty line-->
body
body
body

也就是说,一旦内容被发送到客户端,php就会发送所有的头加上"空行",并且没有办法返回到头部分(一旦将响应头与响应体分隔开的空行发送到客户端后,您就无法"撤消"它)。您需要输出缓冲,即php尽可能长时间地保留repsonse的内容/正文。或者——更可取的是——以这样一种方式构建脚本,即在生成输出之前处理头。在重定向的情况下,说"你在url上找到了内容,但嘿,这是内容"并没有太大意义。