「Premature end of script headers」のエラーが出たときの解消法
MVCモデルの勉強として、先輩がちっちゃなMVCモデルのプログラムを作ってくれました。それをベースにいろいろ機能追加をはかっていたのですが、デバック方法がわからない!というか、ブラウザにデバック内容を表示させたい。おまけにapacheのログでこんなエラー↓が出る(涙)!
[Wed Oct 06 20:26:57 2010] [error] [client 192.168.20.1] Premature end of script headers
躍起になっていろいろ調べて聞いて、習得しました。
■方法/以下の一行をブラウザに表示させたい内容の前に入れる。 print "\n\n";
こんな感じ↓です。
print "\n\n"; #「ヘッダー終わり」の印 #useはなにもプログラムの上に書かなくては動かない、というわけではありません use Data::Dumper; #$aの内容を見たい→ブラウザの更新ボタンを押すとブラウザに表示されます print Dumper $a;
なんで「\n\n」をprintしないといけないのかというと、ブラウザとWebサーバーのやり取りに関係しています。
■ブラウザとWebサーバーのやり取り (1)ブラウザからプログラムにリクエストが来る (2)リクエストをWebサーバー(apache)が受け取ってプログラムが動く (3)プログラムが処理結果をapacheに渡す (4)apacheがブラウザに処理結果を返す (5)ブラウザが返ってきた結果を表示する ↓↓ (5)のときに、「ヘッダーの終わり」が無いとエラー(Premature end of script headers)が出るんです。 「ヘッダーの終わり」がないと、表示させようとしている内容もヘッダーの一部とみなされ、「ヘッダーが全部来てなよ!」、と叱られるわけです。
よく、「Premature end of script headers」でWeb検索かけると、「Content-Type」が無いからだ、と書かれていますが、Content-Typeがなくても「\n\n」があれば表示できるそうです。実際できました。んじゃ、Content-Typeって一体なによ、なにしてるのよ、っていうと、以下。
■Content-Typeの役割 返す値(ファイル)の種類を受け手側にお知らせしていて、受け手側に、何のアプリケーションで開けば良いのか、どんな形式の情報なのか、を伝えている。
今回の場合は、別になくてもいいわけです。先輩も、重要なのはContent-Typeより「ヘッダーの終わり」。ここまで書いてなんですが、ヘッダーの終わりは、改行2個です。