Способен Эхо перед заголовком () - PullRequest
8 голосов
/ 26 августа 2010

При переносе на мой новый сервер наткнулся на что-то странное.

У меня есть скрипт, который перенаправляет пользователей на другую веб-страницу в зависимости от определенных условий.Однако я делал вывод «Redirecting ...», а затем использовал функцию header () для фактического перенаправления.Вот как выглядит код:

if( $condition ) {
    echo 'Redirecting...';
    header( 'Location: ' . $url );
}

Теперь я только заметил, что это неправильно после переключения на наш новый сервер, проверил его и увидел, что он НЕ будет перенаправлять только вывод Redirecting ... икак только я искал об этом, узнал, что вы не можете иметь какой-либо вывод (если не используете ob_start и т. д.) перед использованием функции header ().

Вопрос в том, почему этот код НЕ должен работать в ЛЮБОЙ установке PHP, работа на моем старом сервере?Он будет перенаправлять с echo перед header () без проблем.

Спасибо!

Ответы [ 5 ]

10 голосов
/ 26 августа 2010

Возможно, на старом сервере была включена буферизация вывода: буферизация вывода ничего не выдаст, пока скрипт не завершит работу.Это позволяет ему получить заголовок до фактического вывода (поскольку он знает, что заголовки должны быть отправлены первыми).

Если это имеет смысл.

4 голосов
/ 26 августа 2010

Возможно, в вашей старой установке output_buffering определено как true в php.ini.Это задержало вывод, позволяя вам устанавливать заголовки даже после эхо.

3 голосов
/ 26 августа 2010

У вас, должно быть, была включена буферизация, хотя вы сами этого не делали.output_buffering = On в php.ini?

1 голос
/ 26 августа 2010

Это работало на вашем старом сервере, так как у вас была буферизация вывода по умолчанию, установленная php.ini.

0 голосов
/ 26 августа 2010

Вероятно, по умолчанию на старом сервере была включена буферизация вывода. Это означало, что он не будет echo сразу, а скорее подождет, пока закончится весь сценарий, а затем echo. Это также означает, что заголовок будет отправлен до echo (поскольку он был буферизован) и, следовательно, не приведет к предупреждению.

На новом сервере у вас, скорее всего, не включена выходная буферизация по умолчанию, и это будет означать, что она будет echo сразу, без буферизации, и, следовательно, она будет отправлена ​​перед заголовками и приведет к предупреждение.

Я бы рекомендовал вам использовать headers_sent(), чтобы проверить, были ли отправлены заголовки перед использованием headers() после echo, например:

<?php
echo "Foobar\n";
if(!headers_sent())
  header('Location: /helloworld.php');
?>

Ссылки по теме:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...