PHP почему вы не можете перенаправить после того, как что-то было отправлено в браузер? [Дубликат]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

836
задан 16 revs, 8 users 46% 16 January 2014 в 19:41
поделиться

11 ответов

2654
ответ дан Community 19 August 2018 в 18:52
поделиться

Иногда, когда в процессе dev есть обе рабочие станции WIN и системы LINUX (хостинг), а в коде вы не видите никакого вывода перед соответствующей строкой, это может быть форматирование файла и отсутствие Unix LF (linefeed) заканчивается.

Что мы обычно делаем, чтобы быстро исправить это, переименуйте файл, а в системе LINUX создайте новый файл вместо переименованного, а затем скопируйте его в него. Во многих случаях это решает проблему, так как некоторые из файлов, которые были созданы в WIN, когда-то перемещенные на хостинг, вызывают эту проблему.

Это исправление - это легкое исправление для сайтов, которыми мы управляем по FTP, и иногда может спасти наш новый членов команды некоторое время.

14
ответ дан 2 revs, 2 users 91% 19 August 2018 в 18:52
поделиться

Обычно эта ошибка возникает, когда мы отправляем заголовок после эха или печати. Если эта ошибка возникает на определенной странице, убедитесь, что страница не выполняет эхо-сигналы перед вызовом start_session().

Пример непредсказуемой ошибки:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Еще один пример:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Вывод: не выводить символ перед тем, как вызывать функции session_start() или header(), даже не с помощью пробела или новой строки

1
ответ дан 2 revs, 2 users 96% 19 August 2018 в 18:52
поделиться

используйте

ob_start ();

в самой верхней части вашего скрипта и

ob_end_flush ( );

внизу вашего скрипта. Этот wil включит буферизацию вывода и ваши заголовки будут созданы после того, как страница будет bufferd.

ОБЩИЕ ПРОБЛЕМЫ:

=============== =====

(скопированный ответ из: source )

1) не должно быть никакого выхода (т.е. echo.. или HTML-коды) перед командой header(.......);.

2) удалите любое белое пространство (или новую строку) до <?php и после ?> тегов.

3) ЗОЛОТОЕ ПРАВИЛО! - проверьте, поддерживает ли этот файл php (а также, если вы include другие файлы) UTF8 без кодировки спецификации (а не только UTF-8). Это проблема во многих случаях (потому что кодированный файл UTF8 имеет что-то особенное в начале файла php, которое ваш текстовый редактор не показывает) !!!!!!!!!!!

4) После header(...); вы должны использовать exit;

5) всегда используйте ссылку 301 или 302:

header("location: http://example.com",  true,  301 );  exit;

6) Включить ошибку составление отчетов. И сообщать об ошибке.

7) Если ни одно из вышеизложенных не помогает, используйте перенаправление JAVSCRIPT (однако, сильно не рекомендуемый метод), может быть последним шансом в пользовательских случаях ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
22
ответ дан 3 revs, 3 users 67% 19 August 2018 в 18:52
поделиться

Я получил эту ошибку много раз раньше. И я уверен, что все программисты PHP по крайней мере однажды получили эту ошибку. Чтобы решить эту ошибку, вы можете решить использовать решение по вашему уровню проблемы:

Возможное решение 1:

Возможно, вы оставили пробелы до или после (в конце файла после?>) ie

THERE SHOULD BE NO BLANK SPACES HERE
<?php  

   echo "your code here";

?>
DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.

В большинстве случаев это должно решить вашу проблему. Проверьте все файлы, связанные с файлом require.

Примечание: Иногда EDITOR (IDE), например gedit (редактор linux по умолчанию), добавляет одну пустую строку в файл save save. Этого не должно быть. Если вы используете linux. вы можете использовать редактор VI для удаления пробела / строк после?> в конце страницы.

Если это не ваш случай, тогда вы можете использовать ob_start для буферизации вывода, как показано ниже:

Возможное решение 2:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 
102
ответ дан Amal Murali 19 August 2018 в 18:52
поделиться
  • 1
    ob_start() просто скрывает проблему; не используйте его для решения этой конкретной проблемы. – Ja͢ck 15 May 2013 в 11:21
  • 2
    @ Ja͢ck Если я не использую ob_start(), то что мне делать для решения этой проблемы: Headers already sent – Shafizadeh 14 July 2015 в 17:08
  • 3
    – Samsquanch 14 July 2015 в 19:42
  • 4
    ob_start() не проблема & quot; hide & quot; , она решает проблему . – TMS 22 October 2015 в 20:51
  • 5
    У меня возникла такая проблема, когда я загружал свои файлы на сервер, который поддерживал даже PHP5.3. Использовать сервер с PHP 5.6 или более – GGSoft 9 December 2015 в 12:19
  • 6
    Второе решение сработало для меня. Я попытался удалить все пустые места, но безрезультатно – saintjab 25 September 2017 в 00:10

Другая неудачная практика может вызвать эту проблему, которая еще не указана.

См. этот фрагмент кода:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Все в порядке, верно?

Что делать, если «a_important_file.php»:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Это не сработает? Почему? Потому что уже создана новая строка.

Теперь, хотя это не общий сценарий, что, если вы используете структуру MVC, которая загружает большое количество файлов перед передачей данных на ваш контроллер? Это не необычный сценарий. Будьте готовы к этому.

Из PSR-2 2.2:


  • Все файлы PHP ДОЛЖНЫ использовать Unix LF (linefeed) line ending .
  • Все файлы PHP ДОЛЖНЫ заканчиваться на single blank line.
  • Тег закрытия?> ДОЛЖЕН быть omitted из файлов, содержащих only php

Поверьте, следующие стандарты могут сэкономить вам много часов из вашей жизни:)

20
ответ дан MD. Sahib Bin Mahboob 19 August 2018 в 18:52
поделиться
  • 1
    Согласно нескольким стандартам (например, Zend), вы не должны помещать закрывающий ?> тег в любой файл в любом случае любым способом – DanFromGermany 4 April 2014 в 12:31
  • 2
    Я не могу воспроизвести это в среде Windows, так как он работает с использованием любой комбинации (добавление закрывающих тегов, пробелов, нажатие клавиши ввода и т. Д.). Похоже, что эта проблема происходит в основном в средах Linux. – Junior M 10 June 2015 в 12:11
  • 3
    @JuniorM Он должен быть воспроизводимым. Можете ли вы поделиться кодом, который вы экспериментировали, в сущности или что-то подобное? – MD. Sahib Bin Mahboob 11 June 2015 в 04:59
  • 4
    Я нахожусь в Windows 7 с установленной последней Wamp. Я думаю, что эта ошибка связана со скрытыми символами для конца строки. Мой shortcodes.php Wordpress вызывал эту проблему. Я добавил к этому файлу простую функцию, и он начал запускать эти «отправленные заголовки». ошибка. Я сравнил свой shortcodes.php с wordpress ', и это было нормально, кроме CR LF (типичный конец Windows). Я решаю его, загружая исходный файл из репозитория Wordpress, который имеет LF (конец Linux) вместо CR LF, и я также перенес свою функцию в функции functions.php темы. На основании: бит.ly/1Gh6mzN – Junior M 11 June 2015 в 14:11
  • 5
    @Sahib, обратите внимание, что я все еще не могу воспроизвести то, что указано в этом ответе. Ответ полностью подходит для среды Linux. Я тестировал такие пробелы между ?> <?php, удаляя и добавляя одну пустую строку, добавляя и опуская закрывающий тег ?>. В Windows + Wamp все эти комбинации работают нормально. Wierd ... – Junior M 11 June 2015 в 14:13

Это сообщение об ошибке запускается, когда отправляется сообщение перед отправкой заголовков HTTP (с помощью setcookie или header ). Общие причины вывода чего-либо перед заголовками HTTP:

  • Случайные пробелы, часто в начале или в конце файлов, например:
     <?php
    // Note the space before "<?php"
    ?>
    

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Чтобы избежать этого, просто оставьте закрытие ?> - это не обязательно. g2] в начале файла php. Изучите ваши php-файлы с помощью шестнадцатеричного редактора, чтобы узнать, так ли это. Они должны начинаться с байтов 3F 3C. Вы можете безопасно удалить спецификацию EF BB BF с начала файлов.

  • Явный вывод, например вызовы echo, printf, readfile, passthru, код до <? и т. д.
  • Предупреждение, выданное php, если установлено свойство display_errors php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors или error_reporting , вы должны скорее исправить эту проблему. Основными причинами являются доступ к неопределенным элементам массива (например, $_POST['input'] без использования empty или isset , чтобы проверить, установлен ли вход) или используя неопределенная константа вместо строкового литерала (как в $_POST[input], обратите внимание на недостающие кавычки).
  • Включение буферизации вывода должно устранить проблему; все выходные данные после вызова ob_start буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush .

    Однако, хотя буферизация вывода исключает проблемы, вы должны действительно определить, почему ваше приложение выводит тело HTTP перед заголовком HTTP. Это будет похоже на телефонный звонок и обсуждение вашего дня и погоды, прежде чем сообщить вызывающему, что у него неправильный номер.

    178
    ответ дан NikiC 19 August 2018 в 18:52
    поделиться

    Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым тегом <?php, может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.

    Я видел эти вещи;)

    25
    ответ дан PeeHaa 19 August 2018 в 18:52
    поделиться

    Это из-за этой строки:

    printf ("Hi %s,</br />", $name);
    

    Вы не должны печатать / эхо ничего, прежде чем отправлять заголовки.

    29
    ответ дан Sarfraz 19 August 2018 в 18:52
    поделиться

    Вы делаете

    printf ("Hi %s,</br />", $name);
    

    перед установкой файлов cookie, что запрещено. Вы не можете отправить какой-либо вывод перед заголовками, даже пустую строку.

    38
    ответ дан Seth Carnegie 19 August 2018 в 18:52
    поделиться

    Вместо нижней строки

    //header("Location:".ADMIN_URL."/index.php");
    

    напишите

    echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");
    

    или

    ?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php
    

    Это определенно решит вашу проблему. Я столкнулся с одной и той же проблемой, но решил решить эту проблему путем написания заголовка.

    73
    ответ дан Yogesh Suthar 19 August 2018 в 18:52
    поделиться
    • 1
      это нормально, но если пользователь отключит javascript, он не будет работать. – Mahendra Jella 22 November 2013 в 20:13
    Другие вопросы по тегам:

    Похожие вопросы: