【问题标题】:Headers already sent php - dealing with legacy code标头已发送 php - 处理遗留代码
【发布时间】:2014-12-12 17:47:12
【问题描述】:

我已经看到这个问题发布了一千次,但我还没有看到以下情况的答案。也许已经存在?

我已经确定的一些事情:

  • <?php?> 周围有 NO 个空格。
  • 没有 echo 语句。
  • 没有打印语句或任何其他“输出数据语句”

存在一个问题:

有问题的代码被“包含在导致问题的“布局页面”中,也许有人可以告诉我如何解决这个问题?

所以这里是代码,我没有写这个,我只是在维护它。

$pagetitle = $_SERVER['REQUEST_URI'];
switch ($pagetitle) {
  ...
  case "/locations.php?l=8" :
    echo '<title>Mississauga West, Canada Winemaking - Vinbon</title>';
  break;
  ...
}

在那个 case 语句中,我尝试执行以下操作,但知道由于 echo 语句可能无法正常工作。

case "/locations.php?l=8" :
  ob_start();
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://www.New-Website.com");
  die();
  ob_end_flush();
break;

现在我知道你们已经在一些答案中声明不要在上面设置回声,因为这可能会导致问题。我想ob_start() 会解决这个问题吗?

如您所见,这一定是 301 重定向。

现在这段代码位于名为inc_meta.php 的文件中,然后包含(非必需)在名为layer01.php 的文件中。

它在运行时会导致以下“警告”:

Warning: Cannot modify header information - headers already sent by (output started at /home/content/46/11552446/html/layout/layer01.php:5) in /home/content/46/11552446/html/layout/layer01.php on line 10

Warning: Cannot modify header information - headers already sent by (output started at /home/content/46/11552446/html/layout/layer01.php:5) in /home/content/46/11552446/html/layout/layer01.php on line 11

现在第 5 行是我们执行 &lt;? include inc_meta.php ?&gt; 的地方,而 layer01.php 只不过是一个 html 文件。

第 10 行是&lt;body&gt; 标记上方的一个空格,第 11 行是&lt;body&gt; 标记。

我不能使用 javascript,因为这必须是该位置的 301 重定向。有人有什么想法吗?

更新 1

所以我尝试删除 echo 语句,因为我认为你们会说这是问题

我现在明白了:

Warning: Cannot modify header information - headers already sent by (output started at /home/content/46/11552446/html/layout/layer01.php:5) in /home/content/46/11552446/html/layout/inc_meta.php on line 51

Warning: Cannot modify header information - headers already sent by (output started at /home/content/46/11552446/html/layout/layer01.php:5) in /home/content/46/11552446/html/layout/inc_meta.php on line 52

第 51 和 52 行参考:

header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.New-Website.com");

【问题讨论】:

  • 我看到的第一个错误 .. 你在 ob_start() 之前使用 echo 产生的输出和标题不再起作用
  • 我认为我确实删除了它,同样的错误。 @donald123
  • @donald123 请查看更新版本。
  • 我建议您做的是一一删除包含/要求,直到您不再收到错误为止。然后,将它们一一添加,直到您开始出现错误。只有这样,你才会知道是哪一个造成了破坏。另外,也不要在等式之外留下字节顺序标记。这也算作输出。
  • 第 5 行上方发生了什么?在 layer01.php 中?我的理解是,一旦您开始发送信息,就无法调整标题。因此,如果您将该 php 代码嵌入到 html 文件中,例如 &lt;html&gt;&lt;?include...?&gt;,那么您将无法修改标头,因为 &lt;html&gt; 已经发送。

标签: php redirect http-status-code-301 legacy-code


【解决方案1】:

问题在于,在 php/html 文件中,我不知道您必须将此文件包含在 &lt;DOCTYPE ... &gt;&lt;html&gt; 标记之上。一旦包含在内,问题就会自行解决。

所以在我的情况下:

<? include('inc_meta.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
....

而不是原来的:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<? include('inc_meta.php'); ?>
...

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2010-09-09
    • 1970-01-01
    • 2010-11-18
    • 2016-06-17
    相关资源
    最近更新 更多