Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Header('Location:...') после require
Форумы портала PHP.SU » » HTTP и PHP » Header('Location:...') после require

Страниц (1): [1]
 

1. Budulianin - 12 Мая, 2011 - 11:29:48 - перейти к сообщению
Всем привет. Нужно использовать перенаправление. Решил передавать заголовки header('Location:...')

Но говорят что эту функцию можно использовать только перед выводом любых тегов и использования incluide require.

А мне перед отправкой заголовка нужно использовать require для подключения PHP модуля.

Как быть?(работает нормально, пробовал, ошибок не выводит)
2. grefon - 12 Мая, 2011 - 11:32:10 - перейти к сообщению
Пользуйтесь и не переживайте. Заголовки нельзя выдавать только после того, как Вы что-то отправили в браузер, а если подгружаете скрипт то можно.
3. EuGen - 12 Мая, 2011 - 11:32:47 - перейти к сообщению
Перед любым выводом.
grefon, поправка - если в подключаемом в include или require вывода не проиходит - можно подключать (не знаю, с чего автор взял, что нельзя)
4. Budulianin - 12 Мая, 2011 - 11:33:43 - перейти к сообщению
grefon пишет:
Пользуйтесь и не переживайте. Заголовки нельзя выдавать только после того, как Вы что-то отправили в браузер, а если подгружаете скрипт то можно.


Спасибо я так и думал =)
(Добавление)
EuGen пишет:
Перед любым выводом.
grefon, поправка - если в подключаемом в include или require вывода не проиходит - можно подключать (не знаю, с чего автор взял, что нельзя)


Просто я думал вообще использовать require и include нельзя
5. Мелкий - 12 Мая, 2011 - 11:35:30 - перейти к сообщению
0) у header требование только одно - перед ним не должно быть вывода в браузер. Поэтому можно использовать инклюды, если в них ничего не выводится.
1) буферизация, можно использовать всё, что угодно. См функции ob_start и др.
2) в >=php5.3 ограничение на header снято (видимо, используется всё та же буферизация).
6. EuGen - 12 Мая, 2011 - 11:42:48 - перейти к сообщению
Мелкий пишет:
в >=php5.3 ограничение на header снято (видимо, используется всё та же буферизация).

Верно. Но я лично не приветствую такое поведение. Неявность буферизации при высылке заголовков может привести к неожиданным результатам, которые может быть сложно понять при отладке.
7. Budulianin - 12 Мая, 2011 - 11:45:21 - перейти к сообщению
Всем спасибо =) как всегда быстро и в тему!
8. grefon - 12 Мая, 2011 - 11:49:19 - перейти к сообщению
EuGen пишет:
Но я лично не приветствую такое поведение.

А почему с точки зрения разработки так принципиально отсылать заголовки перед контентом? Любой браузер и так понимает строки заголовка страницы и скрывает их, оставляя видимым только сам код, так чем руководствовались разработчики когда придумали такое условие?
9. EuGen - 12 Мая, 2011 - 11:52:18 - перейти к сообщению
Чем вызвано условие отсылки заголовков до вывода, думаю, и так понятно.
А по поводу того, почему плохо неявно переопределять и отсылать заголовки, где бы они ни были написаны в скрипте - это в некотором смысле нарушает логику, заложенную программистом.
Гораздо более правильным мне кажется самостоятельно заботиться об этом, что дает четкое понимание того, где и в какой момент в скрипте формируются заголовки и как они отсылаются.
10. grefon - 12 Мая, 2011 - 11:56:08 - перейти к сообщению
EuGen пишет:
Гораздо более правильным мне кажется самостоятельно заботиться об этом, что дас четкое понимание того, где и в какой момент в скрипте формируются заголовки и как они отсылаются.

С этим абсолютно согласен, хотя иногда бывали моменты когда, заказчик просил переделать скрипт и надо было те же куки поставить по условию, перед которым большая куча уже отправлялась в браузер - вот тут и приходилось переделывать все с нуля. А жаль Хм

EuGen пишет:
Чем вызвано условие отсылки заголовков до вывода, думаю, и так понятно.

Честно говоря мне не понятно Закатив глазки
11. EuGen - 12 Мая, 2011 - 12:11:43 - перейти к сообщению
Потому что
http://www[dot]w3[dot]org/Protocols/rfc2[dot][dot][dot]6-sec6[dot]html#sec6
Вкратце, по протоколу HTTP 1.1 ответ сервера должен содержать сначала заголовки, а затем тело.
Иными словами, если будет тело вперемешку с заголовками, то это будет что угодно, но не RESPONSE по протоколу HTTP
Да и если логично подумать - в заголовках же идут например, кодировки, способ отображения тела, скажем, скачивать или нет, тип контента и т.п. Как браузеру можно что-либо обработать, не зная как это делать (и что это вообще).
12. Мелкий - 12 Мая, 2011 - 12:11:55 - перейти к сообщению
grefon пишет:
Честно говоря мне не понятно

Требование протокола HTTP: сперва - все заголовки, разделённые \r\n, потом двойной \r\n и тело документа с любым содержанием.
13. grefon - 12 Мая, 2011 - 12:22:45 - перейти к сообщению
Понял, большое спасибо!

 

Powered by ExBB FM 1.0 RC1