Почему этот заголовок перенаправляет работу после того, как содержимое уже отражено? - PullRequest
3 голосов
/ 29 октября 2011
<?
echo "lalala";
header("Location: http://www.google.com/");

Если я положу это в простой файл php и доставлю через стандартный сервер apache2 с mod-php (PHP версии 5.3.2-1ubuntu4.10), перенаправление в Google работает.

<?
echo "lalala";
flush();
header("Location: http://www.google.com/");

этот код явно не производит рабочего перенаправления.

У меня вопрос, как обрабатывается первый код и почему он работает. Потому что я помню времена, когда подобные вещи были невозможны. Является ли mod-php или apache достаточно умным для буферизации всего запроса и размещения заголовков перед контентом?

И

Могу ли я рассчитывать на это, если я не буду сбрасывать вывод вручную? Потому что это сделало бы мое заявление намного проще ...

Ответы [ 2 ]

7 голосов
/ 29 октября 2011

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

http://php.net/manual/en/function.ob-start.php

2 голосов
/ 29 октября 2011

Функция заголовка добавляет общий HTTP-заголовок к ответу HTTP.Итак, перенаправление установлено, и браузер получает сообщение 302. перед тем, как показать вам вывод.

сбрасывает команды php для отправки http-ответа, уже подготовленного в момент его вызова.Вот почему второй код не устанавливает заголовок (он должен быть установлен перед отправкой ЛЮБОГО вывода).

И PHP не должен выводить одну вещь, пока:

  • сценарий обрабатывается (даже если ошибка останавливает синтаксический анализ)
  • вы устанавливаете его для отправки вывода куда-либо в сценарии с помощью flush ()

Наконец, проверьте это на контроле вывода1013 *http://www.php.net/manual/en/intro.outcontrol.php

...