【问题标题】:PHP header redirect not working on ApachePHP标头重定向在Apache上不起作用
【发布时间】:2011-07-06 01:48:29
【问题描述】:

这是我在这里的第一个问题,我会尽量遵循我在注册时收到的所有建议......

我的问题是尝试执行 PHP 重定向时出现“已发送标头”错误。

我有这个小脚本来测试重定向:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >
</head>
<body>
<?php
if (isset($_POST['go']) && $_POST['go'] == 'go') {
$redirectURL = 'test1.php'; 
header( 'Location: ' . $redirectURL ) ;
exit();
}
echo '<p>This is Page 1. We will test a redirect. Type in \'go\' and hit submit:</p><br><br>';
echo '<form name="test" method="post" action="' . $_SERVER['PHP_SELF'] . '">';  
echo '<input type="text" name="go">';   
echo '<input type="submit" name="submit">';
echo '</form>';
?>
</body>
</html>

在 Windows 服务器上运行时重定向很好,但在 Apache 上它给出了错误:

警告:无法修改标头信息 - 第 10 行 /home/simply92/public_html/test/testUTF.php 中的标头已由(输出开始于 /home/simply92/public_html/test/testUTF.php:7)发送

第 7 行是 php 标签。

我使用我的网络主机的代码编辑器通过编码 ISO-8859-1 进行保存(这应该可以排除任何 BOM,对吗?)我将 php.ini 中的默认字符集设置为 ISO-8859-1 为好吧(以防万一。)

一个奇怪的事情是,当我删除 doctype 和 php 标记之前的所有内容并且脚本中的第一行是 &lt;?php 时,它甚至会在 Apache 上重定向。显然这不是解决办法。

所以我的问题是:我怎样才能在我的 header() 调用之前找出正在发送的内容,然后,我怎样才能摆脱它?

希望有人能指出我正确的方向!

提前致谢。

【问题讨论】:

    标签: php redirect http-headers


    【解决方案1】:

    PHP 的标头要求输出缓冲区没有任何其他数据。 headers 必须在 doctype、head 和 body 标签之前设置。这应该工作

    <?php
    if (isset($_POST['go']) && $_POST['go'] == 'go') {
    $redirectURL = 'test1.php'; 
    header( 'Location: ' . $redirectURL ) ;
    exit();
    }
    ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >
    </head>
    <body>
    <?php
    echo '<p>This is Page 1. We will test a redirect. Type in \'go\' and hit submit:</p><br><br>';
    echo '<form name="test" method="post" action="' . $_SERVER['PHP_SELF'] . '">';  
    echo '<input type="text" name="go">';   
    echo '<input type="submit" name="submit">';
    echo '</form>';
    ?>
    </body>
    </html>
    

    【讨论】:

      【解决方案2】:

      这是 php 最著名的错误之一,你可以发search on Google for explanations

      在您的情况下,您的代码是错误的,因为您在 header 调用之前做了很多输出。在 Windows 中它可以正常工作,因为您可能打开了输出缓冲而在 Apache 中没有。

      您可以阅读它here,但我真的建议您更改代码,只有在您没有向浏览器发送任何输出时才应调用header 函数,您可以通过使用来检查它header_sent 函数。

      【讨论】:

      • 我将更改我的代码。我只是没有意识到 doctype 等算作输出。谢谢!
      • 实际上,也感谢您指出有关输出缓冲的一点。了解正在发生的事情是一种很好的感觉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2014-11-19
      • 1970-01-01
      • 2014-05-26
      • 2022-01-17
      相关资源
      最近更新 更多