Причина, по которой это не работает, заключается в том, что заголовки предшествуют содержимому в HTTP-запросе.Когда вы выводите контент, PHP опережает игру, отправляя все заголовки и весь контент, обработанный на данный момент.Для отправки HTTP-запросов нет CTRL + Z, поэтому функция header()
не может добавлять заголовки после их отправки.
Однако вы можете вызвать header()
после вывода содержимого, если вы используетеОбе буферизирующие семейства функций.Вызовите ob_start()
для буферизации вывода страницы, сделайте все необходимые вызовы заголовков или вывод содержимого и, наконец, отправьте вывод с ob_end_flush()
.Пример.
<?php
ob_start(); //Start buffering
?>
<p>This is output!!!</p>
<?php
header('403 Moved Permanently'); //Fancy redirect is fancy
ob_end_flush(); //Send page content with redirect header
?>
Единственный возможный недостаток использования буферизации состоит в том, что пользователь будет испытывать незначительное зависание при получении содержимого до вызова команды ob_end_flush()
.Скорее всего, это не будет заметно, поэтому вам не стоит об этом беспокоиться!
Прежде чем пройти через все это, вы можете рассмотреть возможность перемещения всех вызовов заголовка в место до вывода контента в вашкод.Также проверьте открывающий тег PHP на наличие предшествующих пробелов, так как они заставят отправлять заголовки и содержимое.