Почему не работает header('Location: site.com') в PHP-скрипте
Бывает так, что необходимо перенаправить пользователя на другую страницу сайта. Например, это может потребоваться в том случае, если он добавляет новость (url наподобие ‘http://site.com/add/’), ввел ее в поля формы и нажал кнопку “сохранить”. В поле action этой формы вписана та же страница. PHP-скрипт, запускаемый по этому адресу, выполнил сохранение в базу данных. И программист хочет, чтобы после успешного добавления новости пользователь увидел их список (например, http://site.com/list/). Для этого часто используют перенаправление, которое может быть выполнено с помощью отправки http-заголовка “Location: http://site.com/list/”. Когда заголовки попадают в браузер, он считывает их и отправляет браузер пользователя по этому адресу.
Однако, частенько возникает ситуация, когда такой подход почему-то не работает. При этом интерпретатором PHP может быть выдано предупреждение “Warning: Cannot add header information - headers already sent by”. Но даже такое предупреждение может появиться не всегда, а переход всё равно не происходить. Причиной отсутствия этого сообщения может являться то, что в настройках интерпретатора PHP выставлен запрет на отправку предупреждений (warnings). Это можно исправить с помощью выставления параметра error_reporting = E_ALL в файле php.ini, функции error_reportiong(E_ALL) или конструкции ini_set(‘error_reportiong’, E_ALL). В случае использования фреймворка может понадобиться просто выставить режим разработчика (development) вместо режима production.
Но вернёмся к тому, почему же всё-таки не срабатывает перенаправление, и выводится предупреждение? В сообщении написано, что нельзя добавить информацию о заголовках, потому что они уже отправлены. Чаще всего это бывает по той причине, что перед их отправкой где-то уже произошел вывод в выходной поток как минимум одного символа. Дело в том, что по протоколу http-заголовки должны быть отправлены пред содержимым страницы. Если перед их выводом проскочил хоть один символ, то считается, что их отправка закончена и теперь идет передача тела страницы. Бывает даже такая ситуация, что разработчик просто нечаянно допустил пробел перед тегом <?php в начале php-файла. Этот пробел отправляется в выходной поток, а после этого, в коде, программист начинает выводить заголовок наподобие header(‘Locaiotn: http://site.com/list/’); И, в итоге, происходит то, о чем я написал выше. Кроме этого, очень часто встречается другая ситуация: в коде, который выполняется до этой конструкции, возникает какая-то ошибка. Интерпретатор выдает предупреждение (Warning), либо другое сообщение. И оно уже считается телом страницы, в результате чего отправленные в дальнейшем заголовки не работают, что и приводит к невозможности выполнить перенаправление.
Комментарии
Отправить комментарий