CGIを有効にする

CGIを有効にする設定方法を、Webデザイン学習中の方に分かりやすくご紹介します。

独学!未経験からWebデザイナーになる!! > テクニカルノート > テスト用Webサーバーの設定 > CGIを有効にする

CGIを有効にする

 Yahoo!ブックマークに登録

PCにPerlなどのプログラムがインストールされていたとしても、すぐにCGIが利用できるとは限りません。むしろ分かる人だけ使うような機能はOffにされているのが一般的なため、初期状態では無効になっていることも多いと思います。ここでは、ApacheでPerlによるCGIを使えるようにする方法をご紹介します。

もしまだPerlをインストールされていない場合は、インストールをお済ませください。Mac OSXおよびXAMPPをインストールされている方は、すでにPerlもインストールされていると思います。WindowsでApacheを単品インストールされた方は、Perl(ActivePerl)のインストール for Windowsにて、Perlをインストールしてください。

当サイトに記載されているものは、全て学習目的のローカルテストサーバー向けです。その他の用途には適切でない可能性もありますのでご注意下さい。

CGIの設定方法

CGIモジュールの確認

まずはhttpd.confを開いてください。デフォルトでそうなっているとは思いますが、念のため、下記のような表記があるか、つまりCGIモジュールがロードされるようになっているかを確認してみましょう。万一#から始まっていたら、#を削除してください(繰り返しますが、デフォルトで有効になっているはずですので、通常は何もしなくても大丈夫なはずです)。

LoadModule cgi_module modules/mod_cgi.so

特定の拡張子を、CGIプログラムとして扱うようにする

次に[ AddHandler cgi-script ]でファイル内を検索してください。おそらく、下記のような表記が見つかると思います。

#AddHandler cgi-script .cgi

もし、#から始まっていれば#を削除して、コメントアウトを解除してください。最初から#が無ければ、そのままでOKです。万一記載自体が無い場合は、下記を<IfModule mime_module>~</IfModule>内に記載してください。

AddHandler cgi-script .cgi

この部分は、「.cgiという拡張子を、CGIスクリプトとして扱ってね」というおまじないのようなものです。拡張子.cgiだけでもかまいませんが、半角スペースで区切って記載することで、複数の拡張子を同時に指定することも可能です。例えば下記は、.plも追加した状態です。

AddHandler cgi-script .cgi .pl

CGIの実行許可を与える

CGIというのは、セキュリティ上の理由から、初期設定では特定のディレクトリでしか使えないようになっていることが一般的です。ここではローカルのテスト環境を想定していますので、どこでも使えるようにドキュメントルートに設定しましょう。(例ではD:/wwwがドキュメントルートのパスだとして記載します)もちろんドキュメントルート以外でも大丈夫ですので、各自状況に合わせてパス部分は読み替えてください。

まずは目標のディレクトリの設定部分を探しましょう。下記のような部分です。

<Directory "D:/www">

#~中略~

</Directory>

その中に、[ Options ]から始まっている項目を探してみてください。私のApacheのデフォルト設定では、以下のようになっていました。

Options Indexes FollowSymLinks

これに追加する形で[ ExecCGI ]の指定を追加します。下記のような感じですね。(余談ですが、本番サーバーでの指定の場合、Indexesは無い方がいいです。)もしこの記述自体が無い場合は、新しく<Directory "D:/www">~</Directory>内に[ Options ExecCGI ]と記載してください。

Options Indexes FollowSymLinks ExecCGI

CGIを動かしてみよう

さて、うまくいっていればCGIが有効になっているはずです。まずはApacheを再起動して、試しに簡単なPerlスクリプトをCGIとして動かしてみましょう。下記は、CGIが動作すれば「Hello, World.」と表示される簡単なスクリプトです。1行目のみ、Perlのインストールパスを指定するので、環境により異なります。バージョンやインストール先にも寄りますが、XAMPPの場合は[ #!/xamppのインストールディレクトリまでのパス/perl/bin/perl ]、Mac OSXの場合は[ #!/usr/bin/perl ]らへんを試してみてください。Perl(ActivePerl)のインストール for Windowsの通りにインストールされた場合は、下記をそのまま利用すれば動くはずです。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

具体的には、上記コードのPerlパスを修正し、ドキュメントルートディレクトリに、test.cgiとして保存し、http://localhost/test.cgi でアクセスしてみてください。Hello, World.と表示されれば成功です。お疲れさまでした!

動かなかった場合

動かなかった場合は、表示から問題を切り分けて解決しましょう。経験的には、簡単なタイプミスの場合や、Perlパスの指定が間違っていることが多いですね。

Internal Server Errorと表示される

スクリプトが正常に実行できなかった場合に表示されます。上記スクリプトでは動作確認をとっているので、貼り付けミス(スペースなどが前後に入っていないかなど)、もしくは1行目のPerlパスがうまく指定できていない可能性があります。

Forbiddenと表示される

アクセスが拒否された、つまり実行する許可が下りなかったということです。[ Options ExecCGI ]が、ディレクトリ設定で正しくなされているかを確認してみてください。Windows以外の方は、ファイルのパーミッションも一応確認してください。

Not Foundと表示される

ファイル名のタイプミスをしている可能性があります。ファイル名と、実際にアクセスしているURIを確認してみてください。

ソースコードがそのまま表示される

Apacheが、その拡張子ではCGIだと認識していないようです。[ AddHandler cgi-script .cgi ]が、きちんと設定されているかを確認してみてください。また、スクリプトファイル名も、.cgiになっているかも確認してみてください。

おまけ:WindowsでのPerlパスのお話

Windowsをお使いの方は、#!/usr/local/bin/perlというのが不思議に感じられるかもしれません。C:\usr\local\bin\perlにPerlがある場合は、普通に考えれば#!C:\usr\local\bin\perlというパス指定になるはずです。というか、実際にそれでも動きます。

しかし、UNIXとの互換のためか\を/(スラッシュ)にして、、#!C:/usr/local/bin/perlでも動きます。さらには、C:ドライブはシステムドライブなためか、これも省略できます。それでWindowsでも、#!/usr/local/bin/perlのようなパスが使えるんですね。

ちなみに、UNIXの世界では、/usr/local/bin/perl, または、/usr/bin/perlにPerlがインストールされることが一般的です。なので、C:\usr\local\bin\perlにPerlをインストールすれば、スクリプト内のPerlパスを変更することなく、ローカルでも本番のUNIXサーバでも、同様に動かすことが可能なのです。(いちいちパスを書き換えていたら大変ですからね)

Perl(ActivePerl)のインストール for Windowsで、C:\usr\local\ にActivePerlをインストールしましたが、 これはPerlを、C:\usr\local\bin\perlに配置されるようにインストールしたかったから、というわけなのです(本当は他にもやり方はあるんですけれど、これが一番簡単なので)。

このページをはてなブックマークに追加 Check  Yahoo!ブックマークに登録

コメント

クルット さん 2011年02月23日16時18分
設定ごとに質問して申し訳ありません。

今CGIの設定を終えて、簡単なPerlスクリプトをCGIとして試しに動かしてみるところです。
●Perl(ActivePerl)のインストール for Windowsの通りにインストールしています。
●この作業までは何度もタイプミスの確認をしてApacheも正常に起動しているので問題ないと思います。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World."; 

をメモ帳に貼り付けて保存したら拡張子が”test.cgi.txt”となりアクセスしても「Webページがみつかりません」となります。Dreamweaverでも同様になるのですが、保存時のファイルの種類は”テキストファイル”で間違っているのでしょうか?

--------関係のない作業なのかもしれませんが・・・?-----------

拡張子を表示させない方法で調べたのですが
●環境はWindowsXPです。

1.エクスプローラ(マイコンピュータ)の、ツール(T)-フォルダオプション(O)を押します。
2.[表示]と書かれたタブをめくります。
3.たくさんのチェック項目が並んでいますが、これを下にスクロールすると、
  [登録されている拡張子を表示しない]の項目があります。
  これのチェックを外して[OK]を押してください。

この作業をしても拡張子が表示されたままでした(もとより項目のチェックは入っていませんでした。)

馬場誠 さん 2011年02月24日08時53分
ファイルの拡張子は必ず表示させてください。

結論だけ書くと、新規保存時に「テキストファイル」等ではなく、「全てのファイル(メモ帳の場合)」または「全てのドキュメント(Dreamweaverの場合)」として保存します。これはCGIファイルに限ったことではなく、HTMLファイル等も同様です。

すでにtest.cgi.txtとなってしまっているのは、Windows上で、該当ファイルをシングルクリック→F2キーを押せば名前が変更できるので、test.cgiに変更するといいでしょう。
クルット さん 2011年02月24日11時21分
もちろん、
●「全てのファイル(メモ帳の場合)」または「全てのドキュメント(Dreamweaverの場合)」として保存も
●名前の変更で”.txt”を変更する(拡張子を変更するとデータが使えなくなるの表示が出ました)
作業もしたのですが、「Webページがみつかりません」の表示になります。

記述が正しいとしたら、後考えられるのはPerl(ActivePerl)のインストールがうまくできてないということなのでしょうか?
馬場誠 さん 2011年02月24日22時57分
もし「記述が正しいとしたら」そういう可能性もあるかもしれません。しかし、「Webページがみつかりません」ということは、Perlインストールのどうこう以前の問題のように思います。

ここ一週間で何度も質問されていますが、時には自分で解決しようと努力するのも、問題解決スキルを磨く訓練になりますよ!ぜひ頑張って試行錯誤して、解決してみてください☆
クルット さん 2011年02月25日12時28分
解決しました。
hogefoobar.co.jpのフォルダにもtest.cgiデータを入れたら起動するようになりました。

今度からは分からないことがあったら試行錯誤してみます。
どうしても分からないときはまた質問してもよろしいでしょうか?

ご指導ありがとうございました。



馬場誠 さん 2011年02月25日21時46分
自分の力で解決できると一段とうれしいですよね♪そんな楽しさも知ってもらえたらな、という気持ちもあり昨日のようなコメントをさせていただきました。
> どうしても分からないときはまた質問してもよろしいでしょうか?
はい、もちろんです! 試行錯誤した上で解決できないことはお気軽にご質問ください。 (いずれ技術的なことも質問できる掲示板なども作ろうと思っていますので、その時は是非そちらもご利用くださいね)
ゆみママ さん 2012年04月06日12時12分
馬場様、こんにちは。

いつもお世話になっております。

新しく購入したPCに今回はXAMPPをインストールしました。

今まで順調に来ていたのですが、どうしてもCGIが動かなくてどうしたらよいかわからなくてこちらから
投稿させていただきました。

CGIの設定方法のところを順を追って記載されている通りに設定しました。
そして、CGIを動かしてみるのですが、下記のエラーがずっと出てきてしまいます。


「Object not found!
 
要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 

サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。 

Error 404
 
localhost
04/06/12 11:42:40
 Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1 」

ドキュメントルートはD:/wwwです。
動作を試すために記述したスクリプトは以下です。


#!/xampp/perl/bin/perl
print"Content-type:text/html\n\n";
print"Hello,World";


ドキュメントルートのすぐ下に「test.cgi」というファイル名にして保存しました。
パスが間違っているのかタイプミスがあるのか、いろんなことを試しましたが、全部上記のエラーが出てきてしまってどうしたらよいかわからなくなってしまいました。

お忙しいところ恐れ入りますが、ご回答いただけましたらうれしく思います。

よろしくお願いいたします。
馬場誠 さん 2012年04月06日19時26分
ゆみママさん、こんばんは。
新PCで学習はかどっていますか?(^^)

XAMPPでのCGIですが、たしかXAMPPは何もしなくてもCGIが動くようになっていたと思います。

Error 404というのは、ファイルが存在しないという意味のHTTPステータスコードが出力されたということです。(以前301リダイレクトについて触れたことがありますが、その301も同じくHTTPステータスコードです)

つまり、リクエストに対してそのようなファイルはないですよ、という意味であり、該当のファイルをApacheが認識できていないということです。リクエストしたURIやCGIのファイル名にタイプミスが無いかや、DocumentRootの設定などをもう一度確認してみてください。

なお、DocumentRootの設定に問題がある場合は、通常のHTMLファイルも表示できないはずです。CGIファイル以外はhttpで表示できていますでしょうか?
ゆみママ さん 2012年04月08日03時05分
馬場様、こんばんは。

最近、ことあるごとにいろいろな問題にハマりまくっていて、勉強が進んでいません(>_<)
PC2台目の無線の設定がうまくいかなかったり、このXAMPPでも相当ハマっています(^^ゞ
私事ですが、子供の入園準備でいろいろ作り物をしていたりということもあって、3月4月は何かと忙しいですね。

前置きが長くなってすいません。

CGIが動かないので、またいろいろと試してみました。

test.cgiのスクリプトを何度見直しても間違えているところはないので、次はためしにindex.phpをドキュメントルート直下においてみました。(簡単なスクリプトを書いたものです。)
そして、http://localhost/index.phpにアクセスしても404エラーが出てしまいました。

これはなんだかおかしいと思って、xamppの管理画面に接続しようとすると、接続できなくなっていました!
この段階で、http://localhost/にアクセスすると、初めて作成したサイトのトップページが表示されました。

何がどうなっているのか全然わからなくなってしまったので、ドキュメントルートにあるファイルを全部削除して、xamppもアンインストールの後再インストールを行いました。

そしてxamppのインストールを終えて、http://localhostに接続すると、なぜか初めて作成したサイトのトップページが表示されてしまうのです。
http://127.0.0.1にアクセスすると、xamppの管理画面が表示されましたが、localhostと127.0.0.1とでなぜ違うファイルが表示されてしまうのでしょうか?
コマンドプロンプトで80番ポートを調べてみると、skypeではない何かに使われていたので、ファイル名を調べたらhttpd.exeとなっていました。

ただ、このhttpd.exeもコマンドプロンプト上で2つ存在していて、1つはC:/xampp/apache/bin/httpd.exeだと分かったのですが、もうひとつのファイルが何なのかが不明です。コンピューター内を検索しても、apacheのファイル以外は出てきません。

ドキュメントルートに保存したファイルをすべて削除してごみ箱も空の状態になっているのに、なぜlocalhostで表示されるのが、初めて作成したサイトのトップページになってしまうのでしょうか?
httpd.exeファイルと関係がありそうでしょうか?

再インストールして、バーチャルホストの設定をしたのですが、Apacheが動かなくなってしまったので、
ドキュメントルートを変更したところまで戻してみました。
すると、Apacheは動いていますが、localhostに接続すると相変わらずサイトのトップページで、127.0.0.1に接続すると、Index ofになり今度はxamppの管理画面に接続できなくなってしまいました。

わけがわからなくなってしまっていて申し訳ありません。

お忙しいところ恐れ入りますが、アドバイスいただけましたらうれしく思います。
よろしくお願いいたします。





馬場誠 さん 2012年04月09日09時54分
状況から推測するに、発端はlocalhostのバーチャルホスト設定がされていないために発生した現象ではないでしょうか。こちらのバーチャルホストを設定する-localhostも併用したい場合のケースです。

バーチャルホストを一つでも設定した場合、そのままlocalhostでリクエストすると、一番上に設定したバーチャルホストのドキュメントルートを参照してしまいます(今回だと、これが最初に作ったサイトなのではないでしょうか)。

最後にインストールを行った際には、バーチャルホストの設定をする前の段階に戻されたようですが、ファイル自体を置いていないのにも関わらず、まだ最初に作ったサイトが表示される場合は、後述しますがキャッシュが残っている可能性があります。一度ブラウザのキャッシュをクリアしてみてください。


今回の例だと、バーチャルホストも利用する場合は、二つ方法があると思います。

一つ目は、localhostにD:/wwwを対応させる場合です。この場合は、httpd-vhosts.confかhttpd.confに以下のようなバーチャルホストの設定を追加すればOKです。
(Directoryディレティブで、アクセス権限を付与するのを忘れないでくださいね)

<VirtualHost *:80>
ServerName localhost
DocumentRoot "D:/www"
</VirtualHost>

しかしこのままだと、XAMPPの管理画面が表示できません。
対処法として、以下を追加して、
<VirtualHost *:80>
ServerName zampp
DocumentRoot "C:/xampp/htdocs"
</VirtualHost>

加えて hostsファイルに 127.0.0.1 zampp とし、
http://zampp/ でXAMPPの管理画面にアクセスする方法があります。
(ServerNameとhostsの、zamppという文字は任意です)


二つ目は、localhostを、XAMPP用にしてしまう方法です。この方法であれば、
<VirtualHost *:80>
ServerName localhost
DocumentRoot "C:/xampp/htdocs"
</VirtualHost>

でOKですね。http://localhost/でXAMPPの管理画面にアクセスできます。

ただしこちらはhttp://locahost/で、D:/www に対応しないので、簡単なテストするときでも、XAMPPの初期の公開ディレクトリにファイルを配置(今回の例ならC:/xampp/htdocsにtest.cgiを配置)するか、別途バーチャルホストを設定する必要があります。



なお、ファイルを全て削除した後にも表示されてしまったのは、おそらくキャッシュを読んでいたせいではないかと思います(存在しないファイルはどうやっても読み込むことができないため)。おかしいな、と思った時は、キャッシュをクリアしてみるといいでしょう。簡単に今見ているページのキャッシュをクリアして再読み込みをするのは、Windowsの場合はCtrl+F5キーでできます。



余談ですが、127.0.0.1とlocalhostは同じ127.0.0.1に対応しますが、同じようで異なります。localhostという名のバーチャルホスト、のような感じに捉えておかれるといいかもしれません。

127.0.0.1も、きちんと明示的にバーチャルホスト設定(ServerName 127.0.0.1~)をして、適切なアクセス制限を設定してあげれば、意図したディレクトリに対応させることが可能です。

それと、私も気にしたことがありませんでしたが、httpd.exeが二つあるのは仕様のようですね。
ゆみママ さん 2012年04月11日17時45分
馬場様、こんにちは!

ご回答どうもありがとうございました!
お返事が遅くなってしまって申し訳ございません。

アドバイスいただきましたように進めてみると、cgiがちゃんと動くようになりました(^^)
ありがとうございました!

でも、xamppの管理画面だけ接続できていない状態が続いています。

httpd-vhosts.confに

<VirtualHost *:80>
ServerName localhost
DocumentRoot "D:/www"
</VirtualHost>

<VirtualHost *:80>
ServerName zampp
DocumentRoot "C:/xampp/htdocs"
</VirtualHost>

のように記述し、 hostsファイルに 127.0.0.1 zampp を追加したのですが、http://zampp/に接続すると、

Access forbidden!
Error 403

が出てしまいます。

アクセス権限は以下のようにしています。

<Directory "D:/www">
~中略~

    #Order allow,deny
    #Allow from all
  Order Deny,Allow
  Deny from all
  Allow from localhost
  Allow from 127.0.0.1
  Allow from 192.168

</Directory>

何度もお聞きして申し訳ございません。
よろしくお願いいたします。
馬場誠 さん 2012年04月11日19時36分
ゆみママさん、こんばんは。
まずはエラーメッセージを調べてみるところから始めると分かりやすいと思います。
> Access forbidden!
> Error 403
まず、403というステータスコードはAccess forbiddenということもあり、アクセス権限がないという意味を表します。 http://xampp/にリクエストした際にアクセス権限が無いわけですから、対応するドキュメントルートであるC:/xampp/htdocsにアクセス権限を与えないといけません。 本来C:/xampp/htdocsには最初からアクセス権限があるのですが、これは初期のドキュメントルートですので、おそらくその部分をD:/wwwに変更されたのではないでしょうか。 もし、httpd.confに <Directory "C:/xampp/htdocs"> ~略~ </Directory> というのがなければ、適当な箇所に新設して、D:/wwwと同様のアクセス権限を設定してみてください。
ゆみママ さん 2012年04月14日00時09分
馬場様、こんばんは!

アドバイスありがとうございます!
またお返事が遅くなってしまって申し訳ございません。

"C:/xampp/htdocs"にアクセス権限を設定すると、XAMPPの管理画面に接続することができました。
httpd.confの修正ばかり考えていて、「追加する」ということを忘れてしまっていました。

本当にありがとうございました!

これでやっと、新しいPCがメインマシンになります(*^_^*)
今度は相当ハマっているCSSを解決していきたいと思います(笑)
馬場誠 さん 2012年04月14日09時58分
ゆみママさん、こんにちは。

できてよかったですね。

余談ですが、あまりないとは思いますが、さらに多くのディレクトリにアクセス許可の権限を設定する場合は、今回のように逐一設定するのは面倒になってきます。以下のルートディレクトリ部分にアクセス権限を設定することで、一括で指定もできます(あくまでテスト環境のみの場合です)。
<Directory />
~略~
<Directory>
(※上記部分は最初から存在し、初期状態ではアクセス権限無しになっています)


これから新PCでバリバリ学べますね(^-^)
それにもうすぐお仕事のスタート!スムーズに準備が進むといいですね☆
テクニカルノート
環境環境のインストール
Apacheのインストール for Windows
XAMPPのインストール for Windows
MAMPのインストール for Mac
Perl(ActivePerl)のインストール for Windows
PHPのインストール for Windows
MySQLのインストール for Windows
PostgreSQLのインストール for Windows
テスト用Webサーバーの設定
外部からのアクセスを制限する
ドキュメントルートを変更する
バーチャルホストを設定する
.htaccessを有効にする
└CGIを有効にする
.htaccessの設定
エラーページを指定する
特定のファイル・ディレクトリのアクセスを拒否する
簡易的なユーザ認証をする
 ホームページへ戻る

独学!未経験からWebデザイナーになる!! > テクニカルノート > テスト用Webサーバーの設定 > CGIを有効にする