Как я могу перенаправить в PHP без ошибок заголовка?

Как я могу перенаправить на PHP с этой установкой ниже, не получая ошибок вывода заголовка, я понимаю, что ничто не может быть напечатано в браузере до того, как заголовок установлен, я ищу решение, а не объяснение причин этого.

<?PHP // include header include ('header.inc.php'); // In my body section file if this is a page that requires a user be logged in then // I run a function validlogin($url-of-page-we-are-on); inside of that file //the function is below, it outputs a redirect to login page if not logged in // include body of page we want include ('SOME-FILE-HERE.php'); // include footer include ('footer.inc.php'); // here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis function validlogin($url) { if ($_SESSION['auto_id'] == '') { $msg = 'Please login'; $_SESSION['sess_login_msg'] = $msg; $_SESSION['backurl'] = $url; $temp = ''; header("Location: /"); exit(); } } ?> 

Я хотел бы использовать функцию заголовка пользователя php, а не перенаправление мета или javascript.

Также, если возможно, список страниц, требующих входа в систему или нет, не является вариантом

Разве вы не можете это сделать:

 <?php validlogin($url); // call the function here include ('header.inc.php'); include ('SOME-FILE-HERE.php'); include ('footer.inc.php'); ?> 

Или, поместите включенные файлы в каждый из файлов типа «НЕКОТОРЫЕ ФАЙЛЫ ЗДЕСЬ», если это возможно, так что в итоге вы получите:

 <?php validlogin($url); // call the function here include ('header.inc.php'); ?> <h1>Page heading</h1> ...page content etc... <?php include ('footer.inc.php'); ?> 

Используйте ob_start () в первой строке, даже для включения. поэтому вы можете устанавливать заголовки в любое время.

использовать { echo '<META HTTP-EQUIV="Refresh" Content="0; URL=process.php">';}

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

Как примечание (хотя я думаю, что вы уже знаете) заголовок не заканчивает сценарий, поэтому exit () (который у вас есть) является определенным требованием.

Делает ли footer.inc.php и SOME-FILE-HERE.php запись в поток ответов немедленно? Потому что, если это так, это не сработает, поскольку вы уже что-то напишете перед отправкой заголовков.

Вам нужно буферировать вывод, чтобы HTTP-заголовок не отправлялся на первый вывод. Вы можете либо ouput_buffering любой вывод неявно, включив ouput_buffering или явно, вызвав ob_start . Но последнее нужно вызывать перед первым выходом, поэтому идеально в первой строке скрипта, который изначально был вызван.

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

Более подробную информацию вы можете найти в Google или в этой статье о выходной буферизации в PHP .