PHP'de HTTP Yanıt Başlıkları ile İlgili Sorun
HTTP kurallarına göre, önce
HTTP başlıkları gönderilir, ardından HTTP yanıt gövdesi gelir.
Bu nedenle, PHP'de header işleviyle çalışmanın
kendine özgü özellikleri vardır.
Olay şu ki, bu işlevi çağırmadan önce
ekrana herhangi bir çıktı yapılırsa,
bu çıktı yanıt gövdesinin başlangıcı olarak yorumlanır.
Bu durumda header işlevini çağırmak,
headers already sent (başlıklar zaten gönderildi) metniyle
bir PHP uyarısına yol açacaktır.
Bu esnada başlıklar yine de gönderilebilir.
Hatta hata bile görüntülenmeyebilir (PHP ayarlarına bağlıdır).
Ama çoğu zaman bu sadece local ortamda (lokalde) olur,
site internete çıkarıldığında ise her şey bozulur.
Ekrana çıktı yapmak denildiğinde, herhangi bir metin kastedilir. Örneğin, şu şekilde:
text
<?php
header('Content-Type: text/html');
?>
Veya boş bir satır:
<?php
header('Content-Type: text/html');
?>
Veya bir boşluk:
<?php
header('Content-Type: text/html');
?>
Veya bir etiket:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Veya echo ile çıktı:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Veya var_dump ile çıktı:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
PHP uyarıları bile ekrana çıktı olarak sayılır. Aşağıdaki örnekte kasıtlı olarak var olmayan bir değişkene erişiliyor, bu da bir uyarı çıktısına yol açacak:
<?php
$text += 1;
header('Content-Type: text/html');
?>
PHP etiketlerinin arasına girilen boşluklar/çıktılar da ekrana çıktı üretir:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
header işlevinden önce kasıtlı olarak
ekrana çıktı oluşturun.
Ortaya çıkan hatanın metnini inceleyin.
Bu kodda yapılan hatayı düzeltin:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>