CGIプログラムに触れたところ403エラーや500エラー
久しぶりにCGIプログラムをカスタマイズしようとXAMPPで実行してみたところエラーが出ました。
Apacheのエラーログ「C:\xampp\apache\logs\error.log」を調べてみたところ、Perlのパスが通っていないのが原因でした。
エラーの内容
[Sat Aug 15 21:54:52.065700 2015] [access_compat:error] [pid 2348:tid 1848] [client ::1:11760] AH01797: client denied by server configuration: C:/xampp/htdocs/xampp/hoge.cgi
簡単に対策できるので、残しておきます。
エラーの原因
通常UNIX系のサーバではPerlのパスが以下のようになっています。
#! /usr/bin/perl
対してXAMPPをCドライブ直下にインストールした場合、Perlのパスが以下のようになっています。
#! C:/xampp/perl/bin/perl
対策
CGIプログラムのパスをXAMPP用に変更してもいいのですが、今度は修正忘れで本番環境で動かないと騒ぎそうです。
そこでローカルではWindowsのシンボルリンク機能を使って疑似的に「/usr/bin/perl」で実行できるようにします。
スタートからプログラム名を指定して実行で「cmd」と入力してエンター。コマンドプロンプトを立ち上げて以下のコマンドでシンボリックリンクを作成します。
cd / mklink /d c:\usr c:\xampp\perl mklink /d c:\usr\local c:\xampp\perl
簡単に解説すると「mklink」がシンボルリンクを作るコマンド。
「/d」はディレクトリ、「c:\usr」がリンク、「c:\xampp\perl」がターゲットです。
これで「c:\usr」へアクセスした時に、「c:\xampp\perl」へアクセスするようになります。
これで無事にCGIが実行できるようになります。
Apacheの設定
一応Apacheの設定が間違っている可能性もあるのでCGI用の設定を張っておきます。
XAMPPのApacheの設定ファイルは「C:\xampp\apache\conf\httpd.conf」にあります。
まずモジュールが読み込まれているか調べる
LoadModule cgi_module modules/mod_cgi.so
ルートディレクトリ以下でCGIを使えるようにExecCGIを有効にする
<Directory "C:/xampp/htdocs"> Options Indexes FollowSymLinks Includes ExecCGI AllowOverride All Require all granted </Directory>
CGIスクリプトの拡張子を指定
<IfModule mime_module> (省略) AddHandler cgi-script .cgi .pl .asp (省略) </IfModule>
これで実行できるはずです。
XAMPPでは「C:\xampp\apache\conf\extra\httpd-xampp.conf」もインクルードしているので、動作がおかしい場合は変な記述がないか調べてみてください。