[perlメモ]XREA系サーバでperlのCGIを動かす時の注意点
このブログはXREAさんに設置しています。もともとはさくらインターネットさんのサーバ上にありましたが、負荷で制限をかけられたので仕方なくXREAさんのサーバに引っ越しました。つまり追い出されたわけですw。
他にもさくらインターネットさんのサーバをいくつか借りているのですが、XREAの上位プランであるCORESERVER.JPの下位プランができたのですが年間契約だと月額208円とお安いのでメインのアカウントを残して現在絶賛引越し中です。まあ、癖のあるサーバなので初心者の人にはあまりおすすめしませんけど、自由度は高いサーバです。コストパフォーマンスもいいです。
そういうわけで、CORE-MINIというCORESERVER.JPの下位プランに引越し中なのですが、まあさくらさんで動くCGIが動かなかったりするわけです。
プログラムが悪いのですが、そこら辺の注意点とその対策を書いておきます。
下のようなCGIプログラムが有るとします。このプログラムはXREA系のサーバだとエラーで動きません。一番上の様なエラーが表示されてしまいます。さくらインターネットのレンタルサーバでは動きます。
#!/usr/local/bin/perl
use strict;
use warnings;
my %in = ();
my $hogehoge = 0;
if($in{‘hogehoge’} ne ”){
$hogehoge = 1;
}
print "Content-Type: text/html\n\n";
print "<html><body>hogehoge</body></html>\n";
exit(0);
test01.cgi
Script Error
The script did not produce proper HTTP headers. Please see the error log to see the detail of the errors. Depending on the server configuration, you can also run thisscript under CGIWrap debugging. Usually, either rename or linkthe script temporarily to a file which ends with .cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
というエラーが表示されます。
で、なんでエラーなんだよということなのですが、XREA系サーバの場合エラーメッセージにしたがって.htaccessに「AddHandler cgi-script-debug .cgi」を追加することでエラーの原因を調べることができます。
<Files test01.cgi>
AddHandler cgi-script-debug .cgi
</Files>
.htaccess
.htaccessは上の様に書くといいです。<Files test01.cgi></Files>を付けているのは、AddHandlerを適用するファイルをtest01.cgiファイルだけに限定するためです。(なくてもいいです。)いろんな情報が表示されてしまうので、セキュリティ的にはなるべく自分だけアクセス出来るように.htaccessで制限してから利用した方がいいかと思います。
.htaccessに上のコンフィグを追加してから再度CGIを実行するとブラウザにズラズラといろいろな情報が表示されます。そして最後の方に表示されたのが下の内容です。
argv[0] = ‘cgiwrapd’
Executing ‘/virtual/(中略)/test01.cgi’
Output of script follows:
=====================================================
Use of uninitialized value in string ne at /virtual/(中略)/test01.cgi line 8.
Content-Type: text/html
<html><body>hogehoge</body></html>
「Use of uninitialized value in string eq at /virtual/(中略)/test01.cgi line 8.
の部分に注目。
つまり、test01.cgiの8行目で「初期化されてない値とeq比較してるぞゴラァ」というエラーが発生しているわけです。
「if($in{‘hogehoge’} ne ”){」この部分です。
確かに動くのでこういう風に書いてしまいがちですが、
if(defined $in{‘hogehoge’} && $in{‘hogehoge’} ne ”){
というふうにdefinedで値が設定されているかチェックする処理をつけて上げる必要がります。もしくはexistsを使います。
上記を踏まえて書き換えたのが下のプログラムです。.htaccessをもとに戻して、修正した下のプログラムを走らせてみるとちゃんと「hogehoge」とブラウザに表示されました。めでたしめでたし。
#!/usr/local/bin/perl
use strict;
use warnings;
my %in = ();
my $hogehoge = 0;
if(defined $in{‘hogehoge’} && $in{‘hogehoge’} ne ”){
$hogehoge = 1;
}
print "Content-Type: text/html\n\n";
print "<html><body>hogehoge</body></html>\n";
exit(0);
test01.cgi(改)
あと、少々乱暴な方法としては、use warnings;をコメントアウトしてしまうという方法もありますが、まあ、あまりおすすめしませんが場合によってはありかと思います。
#use warnings;
◇参考:Use of uninitialized value の傾向と対策 – bonar note
◇参考:【xrea+廃止?】CORESERVER.JP Part19【MINI登場】
◇公式:VALUE DOMAIN:バリュードメイン