# Проблема с заголовками HTTP ответа в PHP

По правилам HTTP сначала отправляются HTTP заголовки, а потом тело HTTP ответа. Из-за этого работа с функцией `header` в PHP имеет свои особенности.

Дело в том, что если перед вызовом этой функции будет какой-то вывод на экран, он будет трактоваться как начало тела ответа. В этом случае вызов функции `header` приведет к предупреждению PHP с текстом headers already sent. При этом заголовки может даже и отправятся. Может даже и ошибка не выведется (зависит от настроек PHP). Но чаще всего это будет только на локалке, а при выкладке сайта в интернет все поломается.

Под выводом на экран подразумевается любой текст. Например, так:

`text <?php header('Content-Type: text/html'); ?>`

Или пустая строка:

`<?php header('Content-Type: text/html'); ?>`

Или пробел:

`<?php header('Content-Type: text/html'); ?>`

Или тег:

`<div> <?php header('Content-Type: text/html'); ?> </div>`

Или вывод через `echo`:

`<?php echo 'abc'; header('Content-Type: text/html'); ?>`

Или вывод через `var_dump`:

`<?php $str = 'abc'; var_dump($str); header('Content-Type: text/html'); ?>`

Даже предупреждения PHP будут выводами на экран. В следующем примере намеренно идет обращение к несуществующей переменной, что приведет к выводу предупреждения:

`<?php $text += 1; header('Content-Type: text/html'); ?>`

Разрывы PHP скобок также пораждают вывод на экран:

`<?php echo 'abc'; ?> <?php header('Content-Type: text/html'); ?>`

Намеренно создайте вывод на экран перед функцией `header`. Изучите текст возникающей ошибки.

Исправьте ошибку, допущенную в этом коде:

`<!DOCTYPE html> <html> <head> <?php header('Content-Type: text/html'); ?> </head> <body> text <body> <html>`
← →
↑