Как я могу перенаправить в PHP без ошибок заголовка? - PullRequest
5 голосов
/ 10 августа 2009

Как я могу перенаправить в 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

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

Ответы [ 7 ]

10 голосов
/ 10 августа 2009

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

2 голосов
/ 22 декабря 2010

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

2 голосов
/ 11 августа 2009

Не могли бы вы просто сделать это:

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

Или, если это возможно, поместите включаемые файлы в каждый из файлов типа "SOME-FILE-HERE", чтобы вы получили:

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

<h1>Page heading</h1>
...page content etc...

<?php
include ('footer.inc.php');
?>
0 голосов
/ 10 августа 2009

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

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

0 голосов
/ 10 августа 2009

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

0 голосов
/ 10 августа 2009

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

0 голосов
/ 10 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...