Как уже отмечали некоторые, вы должны выводить заголовки перед содержимым. Идеальный способ сделать это - разделить вашу бизнес-логику и логику представления на разные части, но иногда вы застреваете с устаревшим кодом, который этого не делает.
В этой ситуации могут быть полезны функции PHP output output ; используйте ob_start () и ob_end_flush () для захвата вашего вывода, а затем сбросьте его в конце. Это позволяет вашему коду использовать header () более или менее где угодно, например,
<?php
function doSomeStuff() {
echo 'look, outputting stuff here';
header('Location: /');
}
doSomeStuff();
?>
Приведенный выше код выдаст ошибку об уже отправленных заголовках, но будет работать следующий код.
<?php
function doSomeStuff() {
echo 'look, outputting stuff here';
header('Location: /');
}
ob_start();
doSomeStuff();
ob_end_flush();
?>
В этом случае выходные данные echo () не отправляются до ob_end_flush (), поэтому вызов header () работает правильно. Этот подход можно использовать для упаковки устаревшего кода, который не разделяет должным образом бизнес-логику и логику представления.