Problem med HTTP-svarhuvuden i PHP
Enligt HTTP-reglerna skickas först
HTTP-huvuden ut och sedan brödtexten i HTTP-svaret.
På grund av detta har arbete med funktionen header
i PHP sina särdrag.
Saken är den att om det finns någon utskrift till skärmen
innan detta funktionsanrop,
kommer den att tolkas som början på
svarsbrödtexten. I detta fall kommer anropet
till funktionen header att leda
till en PHP-varning med texten
headers already sent.
Ändå kan huvuden skickas.
Det kanske inte ens visas något fel (beror på
PHP-inställningarna). Men oftast händer detta bara
på den lokala datorn, och när webbplatsen läggs ut på internet
kommer allt att gå sönder.
Med utskrift till skärmen menas vilken text som helst. Till exempel så här:
text
<?php
header('Content-Type: text/html');
?>
Eller en tom rad:
<?php
header('Content-Type: text/html');
?>
Eller ett mellanslag:
<?php
header('Content-Type: text/html');
?>
Eller en tagg:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Eller utskrift via echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Eller utskrift via var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Även PHP-varningar kommer att vara utskrifter till skärmen. I följande exempel görs avsiktligt en åtkomst till en obefintlig variabel, vilket kommer att leda till utskrift av en varning:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Radbrytningar i PHP-områden genererar också utskrift till skärmen:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Skapa avsiktligt en utskrift till skärmen
före funktionen header.
Studera texten i felet som uppstår.
Åtgärda felet som gjorts i den här koden:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>