-1

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

$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);
} 

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

警告:无法修改标头信息 - 此错误已发送标头。请让我知道我在哪里做错了?

谢谢

4

2 回答 2

2

<?php . . . ?>“标头已发送”错误通常是由于 PHP 开始和结束标记 ( )前后有空格引起的

ob_start()通过编写您的 if 条件来尝试以下代码。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;
} 
于 2012-08-31T07:48:04.223 回答
-1
警告:无法修改标头信息 - 标头已由(输出开始于/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 尽可能长时间地保留响应的内容/正文。或者 - 更可取的 - 以某种方式构建您的脚本,即在生成输出之前处理标头。在重定向的情况下,无论如何说“您在 url 找到内容,但是嘿,这是内容”并没有多大意义。

于 2012-08-31T07:48:53.877 回答