Мне надо что бы при выполнениии условия «php» if($T->isAuth()) перенаправило на другую страницу. Все работает хорошо, только меня не перенаправляет некуда, хотя само условие выполняется. Я решил проверить ответ от сервера, и вывести в alert(req.responseText) И оказывается в alert выводится html код страницы index.php на которую должно было прозвестись перенаправление. А самого перенаправления не происходит.
В чем же все таки ошибка? уже несколько часов не могу понять причину.
php Почему не работает редирект Warning: Cannot modify header information — headers already sent by. Ошибка Решение
Возникает, если вы уже сделали что-то что требует установки заголовков браузера, а теперь хотите переписать их новыми. Например, если вы уже вывели текст — то php выставляет заголовки (в частности заголовок Location — которые показывает оставаться ли на запрошенной странице или же нужно нужно перейти на другую страницу и уже там получить ответ на запрос), чтобы показаться браузеру клиента (в своём ответе) как себя вести.
Корень проблемы
Помните, что функцию header() можно вызывать только если клиенту еще не передавались данные. То есть она должна идти первой в выводе, перед ее вызовом не должно быть никаких HTML тэгов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require, в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header(). Те же проблемы могут возникать и при использовании одиночного PHP/HTML файла.
— то есть необходимо избавить скрипт-обработчик от html — ведь он по сути сам ничего не выводит а просто перебрасывает на другой адрес — это первое.
Далее, на самом деле заголовок Location следует менять так:
Эксперимент
Так как echo() вообще-то пишет в тело http ответа, а не в заголовки, а header возвращается void (то есть не возвращает значений), о чём было сказано выше, то смысла в использовании echo() нет, но — тем не менее, предлагаю провести эксперимент:
— так как header() вызывается у вас по сути до echo() (так как header() является аргументом echo()) а значит возврат — заодно проверим если функция возвращает null — будет ли это интерпретироваться как пустая строка или же (что вернее) echo даже не начнёт работать как уже произойдёт редирект.
Ещё раз уточним причину
Т.е. перед вызовом header() не должен выводиться никакой контент ( о чем написано к описанию функции: http://php.net/manual/ru/function.header. )
В нашем случае судя по всему echo не влияет ни на что, а вот html в обработчике очень даже влияет.
Key Words for FKN + antitotal forum (CS VSU):
вопрос решился
По Вашему совету были удалены теги HTML. Теперь переадресация происходит корректно, скрипт-обработчик выглядит так:
Функция echo действительно не влияет на работу, т.е . можно оставить и как у С. Хольцнера:
Также при оформлении кода для редиректа следует обратить внимание на расширение файла, на который производится переход: при предложенном синтаксисе, оно должно быть указано в аргументе header.
Но можно заставить работать и
Но можно заставить работать и предыдущий обработчик
если выставить в файле php.ini опцию
насчёт буферизации
По — умолчанию никакой буферизации вывода нет ( если, конечно вы не нашаманили в файле php.ini и не присвоили директиве output_buffering значение On ) и PHP отсылает данные юзеру, сразу, как только они готовы. Согласно протоколу HTTP, сервер в ответ на запрос пользователя, должен сначала отправить ему служебные заголовки, а уже после, тело страницы. А тут внезапно, в коде вы опять пытаетесь заставить его отправить HTTP — заголовки, вызывая, скажем функцию session_start() — после удачной авторизации. Ясен пень — повторная отправка заголовков запрещена, HTTP — протокол так не работает! Но что ж делать то? Если после вывода на странице, нужно ещё и сессию стартануть и кУку поставить? — Вспоминаем про буферизацию вывода.
— то есть когда выставлен ненулевой размер буфера, то пока он не заполнится ещё есть возможность манипулировать заголовками. При нулевом же размере буфера, после вывода контента, его отдача сразу же предваряется передачей клиенту заголовков http-ответа.
И получается, что мы хотим изменить заголовки, которые уже «улетели» по сети клиенту (а значит, исправить их уже невозможно — в частности заголовок Location, который указывает оставаться ли на запрошенной странице, или запросить другую — ответ скрипта-«перенаправителя» (у нас это обработчик формы) как раз говорит о том, что надо запросить другую страницу), о чем php нас и предупреждает.
Но: решать проблему таким способом конечно нельзя (не сильно корректно, точнее).
Мне надо что бы при выполнениии условия «php» if($T->isAuth()) перенаправило на другую страницу. Все работает хорошо, только меня не перенаправляет некуда, хотя само условие выполняется. Я решил проверить ответ от сервера, и вывести в alert(req.responseText) И оказывается в alert выводится html код страницы index.php на которую должно было прозвестись перенаправление. А самого перенаправления не происходит.
В чем же все таки ошибка? уже несколько часов не могу понять причину.
php Почему не работает редирект Warning: Cannot modify header information — headers already sent by. Ошибка Решение
Возникает, если вы уже сделали что-то что требует установки заголовков браузера, а теперь хотите переписать их новыми. Например, если вы уже вывели текст — то php выставляет заголовки (в частности заголовок Location — которые показывает оставаться ли на запрошенной странице или же нужно нужно перейти на другую страницу и уже там получить ответ на запрос), чтобы показаться браузеру клиента (в своём ответе) как себя вести.
Корень проблемы
Помните, что функцию header() можно вызывать только если клиенту еще не передавались данные. То есть она должна идти первой в выводе, перед ее вызовом не должно быть никаких HTML тэгов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require, в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header(). Те же проблемы могут возникать и при использовании одиночного PHP/HTML файла.
— то есть необходимо избавить скрипт-обработчик от html — ведь он по сути сам ничего не выводит а просто перебрасывает на другой адрес — это первое.
Далее, на самом деле заголовок Location следует менять так:
Эксперимент
Так как echo() вообще-то пишет в тело http ответа, а не в заголовки, а header возвращается void (то есть не возвращает значений), о чём было сказано выше, то смысла в использовании echo() нет, но — тем не менее, предлагаю провести эксперимент:
— так как header() вызывается у вас по сути до echo() (так как header() является аргументом echo()) а значит возврат — заодно проверим если функция возвращает null — будет ли это интерпретироваться как пустая строка или же (что вернее) echo даже не начнёт работать как уже произойдёт редирект.
Ещё раз уточним причину
Т.е. перед вызовом header() не должен выводиться никакой контент ( о чем написано к описанию функции: http://php.net/manual/ru/function.header. )
В нашем случае судя по всему echo не влияет ни на что, а вот html в обработчике очень даже влияет.
Key Words for FKN + antitotal forum (CS VSU):
вопрос решился
По Вашему совету были удалены теги HTML. Теперь переадресация происходит корректно, скрипт-обработчик выглядит так:
Функция echo действительно не влияет на работу, т.е . можно оставить и как у С. Хольцнера:
Также при оформлении кода для редиректа следует обратить внимание на расширение файла, на который производится переход: при предложенном синтаксисе, оно должно быть указано в аргументе header.
Но можно заставить работать и
Но можно заставить работать и предыдущий обработчик
если выставить в файле php.ini опцию
насчёт буферизации
По — умолчанию никакой буферизации вывода нет ( если, конечно вы не нашаманили в файле php.ini и не присвоили директиве output_buffering значение On ) и PHP отсылает данные юзеру, сразу, как только они готовы. Согласно протоколу HTTP, сервер в ответ на запрос пользователя, должен сначала отправить ему служебные заголовки, а уже после, тело страницы. А тут внезапно, в коде вы опять пытаетесь заставить его отправить HTTP — заголовки, вызывая, скажем функцию session_start() — после удачной авторизации. Ясен пень — повторная отправка заголовков запрещена, HTTP — протокол так не работает! Но что ж делать то? Если после вывода на странице, нужно ещё и сессию стартануть и кУку поставить? — Вспоминаем про буферизацию вывода.
— то есть когда выставлен ненулевой размер буфера, то пока он не заполнится ещё есть возможность манипулировать заголовками. При нулевом же размере буфера, после вывода контента, его отдача сразу же предваряется передачей клиенту заголовков http-ответа.
И получается, что мы хотим изменить заголовки, которые уже «улетели» по сети клиенту (а значит, исправить их уже невозможно — в частности заголовок Location, который указывает оставаться ли на запрошенной странице, или запросить другую — ответ скрипта-«перенаправителя» (у нас это обработчик формы) как раз говорит о том, что надо запросить другую страницу), о чем php нас и предупреждает.
Но: решать проблему таким способом конечно нельзя (не сильно корректно, точнее).