「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個です。