PerlのCGIでフォームからpostでデータ取得するサンプルです。 とりあえずhttpdをインストールするあたりから記載していますが、 必要なところから参考にしていただければ。 Amazon Linux の場合、CGI.pmがないのでインストールする手順も記載していますが、 CentOSならおそらくデフォルトインストールされているのでその手順は不要です。 Internal Server Error を発生させその解決法も併せて記載しています。 ■構成情報 ・OS: Amazon Linux AMI release 2012.09(64bit) ・Perl: 5.10.1
■httpdインストール
[root@ip-10-77-30-12 ~]# yum -y install httpd (中略) =========================================================================== Package Arch Version Repository Size =========================================================================== Installing: httpd x86_64 2.2.23-1.25.amzn1 amzn-updates 1.2 M Installing for dependencies: apr x86_64 1.4.6-1.10.amzn1 amzn-main 110 k apr-util x86_64 1.4.1-4.13.amzn1 amzn-main 87 k apr-util-ldap x86_64 1.4.1-4.13.amzn1 amzn-main 17 k generic-logos noarch 16.0.0-1.4.amzn1 amzn-main 588 k httpd-tools x86_64 2.2.23-1.25.amzn1 amzn-updates 75 k Transaction Summary =========================================================================== (省略)
■CGI動作設定
[root@ip-10-77-30-12 ~]# cd /etc/httpd/conf/ [root@ip-10-77-30-12 conf]# cp -p httpd.conf httpd.conf.org [root@ip-10-77-30-12 conf]# vi httpd.conf [root@ip-10-77-30-12 conf]# diff httpd.conf httpd.conf.org 797c797 < AddHandler cgi-script .cgi --- > #AddHandler cgi-script .cgi [root@ip-10-77-30-12 conf]#
■サンプルhtml(radio.html)作成
htmlプログラムは表示上の都合のため画像でご勘弁を。
■サンプルcgi(radio.cgi)プログラム作成
[root@ip-10-77-30-12 ~]# vi /var/www/cgi-bin/radio.cgi [root@ip-10-77-30-12 ~]# cat /var/www/cgi-bin/radio.cgi #!/usr/bin/perl use CGI; $form_data = new CGI; $goods = $form_data->param('goods'); print "Content-type: text/html\n\n"; print "\n"; print "$goods が購入されました。\n"; print "\n"; [root@ip-10-77-30-12 ~]#
■cgiプログラムテスト実行
[root@ip-10-77-30-12 ~]# perl /var/www/cgi-bin/radio.cgi Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /var/www/cgi-bin/radio.cgi line 3. BEGIN failed--compilation aborted at /var/www/cgi-bin/radio.cgi line 3. [root@ip-10-77-30-12 ~]#エラー発生。
perlモジュールとしてCGI.pmがインストールされているか調査
[root@ip-10-77-30-12 ~]# find `perl -e 'print "@INC"'` -name '*.pm' -print | grep CGI find: `/usr/local/lib64/perl5': No such file or directory find: `/usr/local/share/perl5': No such file or directory [root@ip-10-77-30-12 ~]#ないのね…。
■CGI.pmインストール
[root@ip-10-77-30-12 ~]# yum -y install perl-CGI (中略) Package Arch Version Repository Size ======================================================================= Installing: perl-CGI x86_64 3.51-127.15.amzn1 amzn-main 216 k Transaction Summary ======================================================================= Install 1 Package(s) Total download size: 216 k Installed size: 434 k Downloading Packages: perl-CGI-3.51-127.15.amzn1.x86_64.rpm | 216 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : perl-CGI-3.51-127.15.amzn1.x86_64 1/1 Verifying : perl-CGI-3.51-127.15.amzn1.x86_64 1/1 Installed: perl-CGI.x86_64 0:3.51-127.15.amzn1 Complete! [root@ip-10-77-30-12 ~]#
■cgiプログラム再テスト
[root@ip-10-77-30-12 ~]# perl /var/www/cgi-bin/radio.cgi Content-type: text/html <body> が購入されました。 </body> [root@ip-10-77-30-12 ~]#エラーは解消。
■ブラウザで動作確認
CGIを実行させると…、
Internal Server Error キター!(T-T)
Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. ------------------------------------------------------------------------ Apache/2.2.23 (Amazon) Server at 54.xxx.xxx.xxx Port 80原因はradio.cgiファイルに実行権がないためです。
■実行権追加
[root@ip-10-77-30-12 ~]# chmod 755 /var/www/cgi-bin/radio.cgiもう一度ブラウザから同じようにCGIを実行させると・・・、
上記のように正しく表示されました。
■ Content-type: text/htmlも大事
下記のように「Content-type: text/html」を出力し忘れたcgiプログラムを作成すると、
[root@ip-10-77-30-12 ~]# vi /var/www/cgi-bin/radio.cgi [root@ip-10-77-30-12 ~]# cat /var/www/cgi-bin/radio.cgi #!/usr/bin/perl use CGI; $form_data = new CGI; $goods = $form_data->param('goods'); print "\n"; print "$goods が購入されました。\n"; print "\n"; [root@ip-10-77-30-12 ~]#期待通り?Internal Server Errorが出現しますのでお忘れなく。
0 件のコメント:
コメントを投稿