PHP头重定向不适用于Apache

时间:2011-07-06 01:48:30

标签: php redirect http-headers

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

我的问题是尝试进行PHP重定向时出现'header sent'错误。

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

<!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开始输出)< / p>

第7行是php标记。

我使用我的网络主机的代码编辑器来保存编码ISO-8859-1(它应该从等式中得到任何BOM,对吧?)并且我将php.ini中的默认字符集设置为ISO-8859-1 as好吧(如果重要的话。)

有一件奇怪的事情是,当我删除doctype并将其他内容转换为php标记时,它甚至会在Apache上重定向,并让我在脚本中的第一行是<?php。显然这不是解决方案。

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是php最着名的错误之一,你可以制作一个search on Google for explanations

在你的情况下你的代码是错误的,因为你在header调用之前做了很多输出。在Windows中它只是起作用,因为你可能已经打开输出缓冲,而你在Apache中没有它。

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

答案 1 :(得分:2)

PHP的标头要求输出缓冲区没有任何其他数据。必须在打印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>