本日、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 と置き換えて、作業完了。