FreeBSD: 突然 CGI がエラー End of script output before headers

本日、Webページへの訪問者の方から、当サイトの CGI がエラーで落ちるという指摘を頂きました。

当サイトのコンタクトフォームは、ここしばらく更新していないので、突然エラーを吐くことはないはず。
本日、他人の都合を考えない MSNのクローラーが激しくアクセスしてきていたので、メールの遅延が発生しているのかな?と思いながら、コンタクトフォームページのCGIで自分宛にメッセージを送ろうとしたところ、見事 エラー発生!

Internal error で、「End of script output before headers: contact.cgi」と出ています。
一番面倒なエラー 500番台だよ〜。(涙)

Apache のエラーログを見てみると、

AH01215: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./jcode.pl line 684.

とも記録されています。
CGI の場合は、そのCGIコマンドを実行してみると HTML ファイルを吐き出すのが正常。試してみると、HTML ソースは出てこず、perl のエラーが出て来ました。

>./contact.cgi
Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./jcode.pl line 684.
Compilation failed in require at ./contact.cgi line 149.

これは、私が使っているCGI ではなく、CGI から呼び出している定番日本語ライブラリ jcode.pl がエラーを出していることを示していますが、意味はさっぱりわからない。

幸い、このエラーメッセージを二つとも google で検索してみると、同じ現象がありました。

http://icepotato.cocolog-nifty.com/blog/2014/04/jcodepldefinedh.html

http://rightning37.blog64.fc2.com/category3-0.html

これらを参考にさせて頂きました。

jcode.pl を次のように編集して、保存。

    682 sub z2h_euc {
    683     local(*s, $n) = @_;
    684 #    &init_z2h_euc unless defined %z2h_euc;
    685     &init_z2h_euc unless defined $z2h_euc_inited;
    686     $s =~ s/($re_euc_c|$re_euc_kana)/
    687         $z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1
    688     /geo;
    689     $n;
    690 }
    691
    692 sub z2h_sjis {
    693     local(*s, $n) = @_;
    694 #    &init_z2h_sjis unless defined %z2h_sjis;
    695     &init_z2h_sjis unless defined $z2h_sjis_inited;
    696     $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo;
    697     $n;
    698 }

このあと、テストしてみたところ。解決しました。

この結果から、最近 pkg コマンドに促されるまま 更新した perl か、perl モジュールが原因だったと推測できます。jcode.pl って、もう15年以上使わせて頂いていますので、今頃になってこういうトラブルに出くわすとはびっくりです。

そうそう、他に kent-web さんからダウンロードした、掲示板も jcode.pl が含まれていたため、全滅していました。これらも今回修正した jcode.pl と置き換えて、作業完了。

コメントを残す