Я схожу с ума от этой ошибки: не могу изменить информацию заголовка – заголовки, уже отправленные …
Обратите внимание, что я знаю о результатах gazillion в google и переполнении стека. Моя проблема заключается в том, как я построил свои страницы. Чтобы сохранить html отдельно от php, я использую include-файлы. Так, например, мои страницы выглядят примерно так:
<?php require_once('web.config.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Login</title> <link rel="shortcut icon" href="images/favicon.gif"/> <link rel="shortcut icon" href="images/favicon.ico"/> <link rel="stylesheet" type="text/css" href="<?php echo SITE_STYLE; ?>"/> </head> <body> <div id="page_effect" style="display:none;"> <?php require_once('./controls/login/login.control.php'); ?> </div> </body> </html>
Итак, к моменту включения моего php-файла заголовок уже отправлен.
Часть файла include выглядит следующим образом:
// redirect to destination if($user_redirect != 'default') { header('Location:'.$user_redirect); } elseif($user_redirect == 'default' && isset($_GET['ReturnURL'])) { $destination_url = $_GET['ReturnURL']; header('Location:'.$destination_url); } else { header('Location:'.SITE_URL.'login.php'); }
Но я не могу понять, как обойти это. Я не могу перенаправить заголовок перед выходом, поэтому наличие буферизации вывода – единственное, что я могу сделать. Естественно, это прекрасно работает, но, полагаясь на это, просто воняет.
Было бы неплохо, если бы PHP имел альтернативный способ перенаправления или имел дополнительные параметры, чтобы сообщить ему очистить буфер.
Ключ состоит в том, чтобы не отделять PHP от HTML, а отделять презентацию от обработки. Перенаправление на основе состояния приложения является частью обработки. Сделайте это первым.
Как вы сказали, проблема в том, как вы структурировали свои страницы.
Перед отправкой ваших страниц вам необходимо обработать логику аутентификации (и другие). В любом случае, это повышает безопасность.
Как вы, вероятно, уже знаете, вы не должны полагаться на буферизацию вывода, поскольку размер этого буфера может измениться, и то, что у вас есть до того, как ваш логин изменится с вашим шаблоном, вызывая ненадежное поведение даже при включенной буферизации вывода.
Есть ли инструкция echo / print перед утверждениями header
? Это может вызвать эту ошибку.