PHPにおけるHTTPレスポンスヘッダーの問題
HTTPの規則では、まずHTTPヘッダーが送信され、
その後でHTTPレスポンスの本体が送信されます。
このため、PHPの関数headerの取り扱いには
特有の注意点があります。
問題は、この関数を呼び出す前に何らかの画面出力がある場合、
それがレスポンス本体の開始と見なされてしまうことです。
この場合、関数headerの呼び出しは、
headers already sentというテキストの
PHP警告を引き起こします。
この時、ヘッダー自体は送信されるかもしれません。
エラーが表示されないこともあります(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>