HTTP válaszfejlécek problémája PHP-ban
A HTTP szabályai szerint először a
HTTP fejlécek kerülnek elküldésre, majd csak azután a HTTP válasz törzse.
Emiatt a header függvény használata
PHP-ban sajátosságokkal jár.
Az a helyzet, hogy ha bármilyen kimenet kerül a képernyőre
a függvény meghívása előtt,
azt a válasz törzsének kezdeteként értelmezi.
Ebben az esetben a
header függvény meghívása
PHP figyelmeztetést eredményez az
headers already sent szöveggel.
Ekkor a fejlécek akár el is küldődhetnek.
Akár hiba sem jelenhet meg (ez a
PHP beállításaitól függ).
De legtöbbször ez csak a
local környezeten történik, amikor pedig a weboldal felkerül az internetre,
minden eltörik.
A képernyőre történő kimenet alatt bármilyen szöveg értendő. Például így:
text
<?php
header('Content-Type: text/html');
?>
Vagy egy üres sor:
<?php
header('Content-Type: text/html');
?>
Vagy egy szóköz:
<?php
header('Content-Type: text/html');
?>
Vagy egy tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Vagy kimenet a echo segítségével:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Vagy kimenet a var_dump segítségével:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Még a PHP figyelmeztetések is képernyőre kimenetnek számítanak. A következő példában szándékosan egy nem létező változóhoz történik hozzáférés, ami figyelmeztetés megjelenését eredményezi:
<?php
$text += 1;
header('Content-Type: text/html');
?>
A PHP zárójelek közötti sortörések is képernyőre kimenetet generálnak:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Hozzon létre szándékosan kimenetet a képernyőn
a header függvény előtt.
Tanulmányozza a felmerülő hiba szövegét.
Javítsa a kódban elkövetett hibát:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>