Problema com cabeçalhos de resposta HTTP em PHP
De acordo com as regras do HTTP, primeiro são enviados
os cabeçalhos HTTP e depois o corpo da resposta HTTP.
Por isso, trabalhar com a função header
no PHP tem suas particularidades.
O problema é que se houver qualquer saída para a tela
antes da chamada desta função, ela será interpretada como o início
do corpo da resposta. Nesse caso, a chamada da
função header levará
a um aviso do PHP com o texto
headers already sent (cabeçalhos já enviados).
Mesmo assim, os cabeçalhos podem até ser enviados.
Pode ser que o erro nem seja exibido (dependendo das
configurações do PHP). Mas, na maioria das vezes, isso só acontecerá
no ambiente local, e quando o site for publicado na internet,
tudo quebrará.
Por saída para a tela entende-se qualquer texto. Por exemplo, assim:
texto
<?php
header('Content-Type: text/html');
?>
Ou uma linha vazia:
<?php
header('Content-Type: text/html');
?>
Ou um espaço:
<?php
header('Content-Type: text/html');
?>
Ou uma tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Ou saída via echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Ou saída via var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Até mesmo avisos do PHP serão saídas para a tela. No exemplo a seguir, há intencionalmente um acesso a uma variável inexistente, o que levará à saída de um aviso:
<?php
$text += 1;
header('Content-Type: text/html');
?>
A quebra das tags PHP também gera saída para a tela:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Crie intencionalmente uma saída para a tela
antes da função header.
Estude o texto do erro que surge.
Corrija o erro cometido neste código:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
texto
<body>
<html>