Проблема с заголовками 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>