「Premature end of script headers」の対処方法
PerlのCGIで「Premature end of script headers」というエラーが発生する場合の対処方法を紹介します。
1.はじめに
Perlで簡単なCGIを書いて、さくらインターネットのサーバにアップロードして実行したところ、「Internal Server Error」が発生しました。
Apacheのエラーログを見ると、
Premature end of script headers: /home/xxxxx/www/test.cgi
というエラーが発生していました。
かなり初歩的なミスで今までも同じ失敗をしてきたと思うので、備忘録で残しておきます。
1.「Premature end of script headers」とは
「Premature end of script headers」は分かりにくいエラーですが、「スクリプトヘッダーの早すぎる終わり」、つまり「HTTPヘッダーが不完全である」というエラーを指すようです。
もう少し分かりやすく言うと、「CGIプログラムが適切なHTTPヘッダを出力していない」ということになります。
2.エラーになる原因
原因はファイルの改行コードです。
Linuxでファイルの改行コードがCR+LFのままCGIを実行すると、「Premature end of script headers」というエラーになります。
エラーになる理由は、まずLinuxのApacheでは改行コードをLFでしか認識してくれないようで、Perlのshebang行、
#!/usr/bin/perl
の行末に改行コード「CR+LF」があると、LFだけを改行コードと認識するため、余ったCRがPerlのパスにくっついて、
#!/usr/bin/perl<CR>
と解釈されてしまうようです。
そのようなPerlのパスが存在しないことでCGIが正常に動作しなくなり、後方のヘッダ出力も正常に行われず、結果的に「Premature end of script headers」というエラーになるようです。
なお、ネットを検索すると、
#!/usr/bin/perl --
とすると解消するという記事が多くありますが、これは「--」を付与することで「#!/usr/bin/perl」の直後にCRが付与されなくなってパスが正しく認識されるためで、本質的な解決策ではありません。
よって、ファイルの改行コードをLFに変換すれば本問題は解消されると思います。
ただしファイルやディレクトリのパーミッションなどでひっかかる場合もあるので、改行コードが原因でないケースもあります。
3.「Premature end of script headers」を故意に出力する
2項の裏返しで、「Premature end of script headers」を故意に出力するには、次の1行だけの内容のファイル(改行コードはLF)を実行すればいいことになります。
#!/usr/bin/perl
またはshebang行のパスを誤った内容にします。エラーの原因と同じように末尾に適当な文字列をつけてみてもいいでしょう。
#!/usr/bin/perlhoge
いずれにしてもHTTPヘッダが出力されなければ「Premature end of script headers」となります。
4.その他
Apacheのドキュメントにも参考情報が掲載されています。
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて