2010-08-26 4 views
7

Пришел к чему-то странному, перейдя на мой новый сервер.Able to Echo перед заголовком()

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

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

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

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

Спасибо!

+1

Я считаю, что вы можете включить буферизацию вывода по умолчанию в вашем php.ini. Нижняя сторона - это весь запрос, который должен быть заполнен до того, как какой-либо вывод будет отправлен пользователю. – meagar

ответ

9

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

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

+0

Спасибо! что, похоже, проблема только что проверила php.ini на старом сервере, а output_buffering установлен на 4096, так что это было на :) –

1

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

+0

Спасибо! Я ценю это! –

4

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

+0

Спасибо! Я ценю это! –

3

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

+0

Спасибо! Я ценю это! –

0

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

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

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

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

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

+0

Спасибо за помощь. Я ценю это :) –

Смежные вопросы