OXY NOTES

XAMPP1.8.2でCGIプログラムを実行する方法

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」もインクルードしているので、動作がおかしい場合は変な記述がないか調べてみてください。