Перенаправление заголовка PHP не работает на Apache - PullRequest
2 голосов
/ 06 июля 2011

Это мой первый вопрос, и я постараюсь следовать всем советам, которые я получил при регистрации ...

Моя проблема - ошибка «отправленные заголовки» при попытке перенаправить 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 выдает ошибку:

Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с /home/simply92/public_html/test/testUTF.php:7) в /home/simply92/public_html/test/testUTF.php в строке 10

Строка 7 - это тег php.

Я использовал редактор кода моего веб-хостинга для сохранения с кодировкой ISO-8859-1 (которая должна получить любые спецификации из уравнения, верно?), И я установил кодировку по умолчанию в php.ini на ISO-8859-1 как хорошо (в случае, если это имеет значение.)

Одна странная вещь заключается в том, что он перенаправляет даже на Apache, когда я удаляю doctype и все остальное до тега php, и моя самая первая строка в скрипте будет <?php. Очевидно, что это не может быть решением.

Итак, мой вопрос: как я могу узнать, ЧТО отправляется до вызова header (), а затем, как я могу от него избавиться?

Надеюсь, кто-то может указать мне правильное направление!

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Заголовок 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>
2 голосов
/ 06 июля 2011

Это одна из самых известных ошибок для php, вы можете поискать в Google объяснения

В вашем случае ваш код неверен, потому что вы делаете много вывода перед вызовом header. В Windows это работает просто потому, что у вас, вероятно, включена выходная буферизация, а в Apache ее нет.

Вы можете прочитать об этом здесь , но я действительно советую вам изменить ваш код, функцию header следует вызывать, только если вы не отправили какой-либо вывод в браузер, вы можете проверить для этого используйте функцию header_sent .

...