たぶん難しくないApache2・初期設定編その4の補足~CGIの置き場所問題~ [Linux(Apache)]
さて。「その4」でCGIを実行できるようにしたものの、あの設定内容ではCGIに対するURLは http://server/cgi-bin/hoge.pl とかいう感じで、ディレクトリとかの下でCGIを実行できるようにはなっていなかった。まあ、formタグでアクセスしてきている人から見えない形でCGIを実行させるのであれば、基本的にそれでも困らないとは思うのだけども、実際にはそうはいかないかもしれない。
また、動かしたいCGIの種類が沢山あって、 /var/www/cgi-bin 配下にベタで置くとごちゃごちゃして判りにくくなるので、CGIごとにサブディレクトリを作ってその下に置きたいとか、そういう要望も出てくることもあるかもしれない。
そこで、CGIの置き場についていくつかのアプローチを補足しておきたいと思う。
① 個別に ScriptAlias を記述する方法
たとえば、directoryA と directoryB とでCGIを実行したい場合。具体的には、 http://server/directoryA/cgi-bin/cgi1.pl と http://server/directoryB/cgi-bin/cgi2.pl というようなURLにした場合。このようなケースで、CGIを動かすディレクトリが多くないようならば、「ScriptAlias」ディレクティブを個別に記述する方法もある。
ScriptAlias /directoryA/cgi-bin/ /var/www/cgi-bin/directoryA
ScriptAlias /directoryB/cgi-bin/ /var/www/cgi-bin/directoryB
たとえばこんな感じ。また、URLとしてはディレクトリが分かれていても、CGI置き場は同じディレクトリでも構わないよというのであれば、
ScriptAlias /directoryA/cgi-bin/ /var/www/cgi-bin
ScriptAlias /directoryB/cgi-bin/ /var/www/cgi-bin
こんな風にしてしまう手もある。
ディレクトリが1個とか2個とか3個とか、あまり多くないようならこの手でCGIの置き場を設定するのが安全だと思われる。
② 正規表現を用いて指定する方法
基本的な発想は①と同じ。ただ、URLに記述されるディレクトリがあっちこっち大量にあるよという場合は、いちいちScriptAliasディレクティブを書くのが面倒に感じられるかもしれない。そんな場合は正規表現を用いてしまうと楽になる。
正規表現を用いて指定する場合は、ディレクティブも微妙に変化し、「ScriptAliasMatch」というディレクティブを用いる。 http://server/ナントカカントカ/cgi-bin/cgi.pl というURLで使いたい!という場合は
ScriptAliasMatch .*/cgi-bin/(.*) /var/www/cgi-bin/$1
とか指定すれば、URLに「cgi-bin」が現れればCGIとしてScriptAliasMatchディレクティブによってcgi-binディレクトリにあるCGIが検索対象となる。
また、cgi-binディレクトリの下にサブディレクトリを作ってCGIの置き場所を変えることもできる。
③ ドキュメントルートからのディレクトリツリーにCGIを置く方法
それでもやっぱり、ドキュメントルートからのディレクトリツリーの中にCGIを置きたいというケースもあると思う。これまで紹介したような、ScriptAliasあるいはScriptAliasMatchといったディレクティブでドキュメントルート配下のディレクトリを指定する方法でも良いのだけども、ドキュメントルート配下のディレクトリにCGIを置いて実行したい場合には別の方法がよく用いられるので、それを紹介しておきたい。
たとえば、CGIを実行したいURLを http://server/directoryA/ だと仮定する。このとき、ドキュメントルートからのディレクトリだと /var/www/html/directoryA になることは判ると思う。
CGIの実行を許可する指定は、これまで同様に
<Directory /var/www/html/directoryA>
Order Deny,Allow
Allow from All
Options +ExecCGI
</Directory>
と、基本形は変わらず。ただし、このままではどのファイルがCGIなのかApacheは知らないままなので、「このディレクトリにあるナントカカントカ.plはCGIですよ~」などと知らせてやる必要がある。その際に使用されるディレクティブは「AddHandler」ディレクティブである。これによって指定された拡張子のついたファイルは、「ハンドラ」と呼ばれる処理名に関連付けられるようになる。
たとえば、ここで使用する「cgi-script」というハンドラの場合、そのファイルをクライアントにダウンロードさせて表示するという動作をせず、CGIとしてサーバ側で処理を行うようになる。
使用方法は、「AddHandler (ハンドラ名) (拡張子)...」となる。拡張子「.pl」を持つファイルをCGIとして宣言する場合は、「Addhander cgi-script .pl」ということになる。(拡張子は複数あって良い)
<Directory /var/www/html/directoryA>
Order Deny,Allow
Allow from All
Options +ExecCGI
AddHandler cgi-script .pl
</Directory>
こんな感じ。
で、このディレクトリにCGIを置くと http://server/directoryA/CGI.pl みたいな感じでCGIが実行できるようになる。難しくは無いでしょ?
※cgi-scriptハンドラについて補足※
ところで、「cgi-script」ハンドラって、『script』ってつくだけに、PerlとかRubyとかあの辺専用な訳?Cとかでゴリゴリ書いたCGIプログラムはどうすいればいいのよ?
みたいな質問が出そうなので、補足しておきます。ハンドラ名は「cgi-script」ですが、スクリプト専用というわけではないので、Cでゴリゴリ書いたCGIプログラムも、AddHandlerでハンドラに割り当ててやれば問題なくCGIとして動作させることができる。
以下のようにC言語で超簡単なCGIを作ってみる。
で、これをコンパイルして実行してみる。
問題なく実行できている。ファイルの種類を確認しておこう。
ちゃんと、バイナリーの実行ファイルになっていることがわかる。
では、これを /var/www/html/directoryA/ にコピーして、httpd.confを微妙に修正する。修正のポイントは、拡張子「.pl」に続けて、「.cgi」もCGIであることを通知するのである。
<Directory /var/www/html/directoryA>
Order Deny,Allow
Allow from All
Options +ExecCGI
AddHandler cgi-script .pl .cgi
</Directory>
これでApacheを再起動してCGIにアクセスしてみよう。 http://server/directoryA/test_c.cgi で「Return knee-length socks. 」というテキストが表示されれば成功。
また、動かしたいCGIの種類が沢山あって、 /var/www/cgi-bin 配下にベタで置くとごちゃごちゃして判りにくくなるので、CGIごとにサブディレクトリを作ってその下に置きたいとか、そういう要望も出てくることもあるかもしれない。
そこで、CGIの置き場についていくつかのアプローチを補足しておきたいと思う。
① 個別に ScriptAlias を記述する方法
たとえば、directoryA と directoryB とでCGIを実行したい場合。具体的には、 http://server/directoryA/cgi-bin/cgi1.pl と http://server/directoryB/cgi-bin/cgi2.pl というようなURLにした場合。このようなケースで、CGIを動かすディレクトリが多くないようならば、「ScriptAlias」ディレクティブを個別に記述する方法もある。
ScriptAlias /directoryA/cgi-bin/ /var/www/cgi-bin/directoryA
ScriptAlias /directoryB/cgi-bin/ /var/www/cgi-bin/directoryB
たとえばこんな感じ。また、URLとしてはディレクトリが分かれていても、CGI置き場は同じディレクトリでも構わないよというのであれば、
ScriptAlias /directoryA/cgi-bin/ /var/www/cgi-bin
ScriptAlias /directoryB/cgi-bin/ /var/www/cgi-bin
こんな風にしてしまう手もある。
ディレクトリが1個とか2個とか3個とか、あまり多くないようならこの手でCGIの置き場を設定するのが安全だと思われる。
② 正規表現を用いて指定する方法
基本的な発想は①と同じ。ただ、URLに記述されるディレクトリがあっちこっち大量にあるよという場合は、いちいちScriptAliasディレクティブを書くのが面倒に感じられるかもしれない。そんな場合は正規表現を用いてしまうと楽になる。
正規表現を用いて指定する場合は、ディレクティブも微妙に変化し、「ScriptAliasMatch」というディレクティブを用いる。 http://server/ナントカカントカ/cgi-bin/cgi.pl というURLで使いたい!という場合は
ScriptAliasMatch .*/cgi-bin/(.*) /var/www/cgi-bin/$1
とか指定すれば、URLに「cgi-bin」が現れればCGIとしてScriptAliasMatchディレクティブによってcgi-binディレクトリにあるCGIが検索対象となる。
また、cgi-binディレクトリの下にサブディレクトリを作ってCGIの置き場所を変えることもできる。
③ ドキュメントルートからのディレクトリツリーにCGIを置く方法
それでもやっぱり、ドキュメントルートからのディレクトリツリーの中にCGIを置きたいというケースもあると思う。これまで紹介したような、ScriptAliasあるいはScriptAliasMatchといったディレクティブでドキュメントルート配下のディレクトリを指定する方法でも良いのだけども、ドキュメントルート配下のディレクトリにCGIを置いて実行したい場合には別の方法がよく用いられるので、それを紹介しておきたい。
たとえば、CGIを実行したいURLを http://server/directoryA/ だと仮定する。このとき、ドキュメントルートからのディレクトリだと /var/www/html/directoryA になることは判ると思う。
CGIの実行を許可する指定は、これまで同様に
<Directory /var/www/html/directoryA>
Order Deny,Allow
Allow from All
Options +ExecCGI
</Directory>
と、基本形は変わらず。ただし、このままではどのファイルがCGIなのかApacheは知らないままなので、「このディレクトリにあるナントカカントカ.plはCGIですよ~」などと知らせてやる必要がある。その際に使用されるディレクティブは「AddHandler」ディレクティブである。これによって指定された拡張子のついたファイルは、「ハンドラ」と呼ばれる処理名に関連付けられるようになる。
たとえば、ここで使用する「cgi-script」というハンドラの場合、そのファイルをクライアントにダウンロードさせて表示するという動作をせず、CGIとしてサーバ側で処理を行うようになる。
使用方法は、「AddHandler (ハンドラ名) (拡張子)...」となる。拡張子「.pl」を持つファイルをCGIとして宣言する場合は、「Addhander cgi-script .pl」ということになる。(拡張子は複数あって良い)
<Directory /var/www/html/directoryA>
Order Deny,Allow
Allow from All
Options +ExecCGI
AddHandler cgi-script .pl
</Directory>
こんな感じ。
で、このディレクトリにCGIを置くと http://server/directoryA/CGI.pl みたいな感じでCGIが実行できるようになる。難しくは無いでしょ?
※cgi-scriptハンドラについて補足※
ところで、「cgi-script」ハンドラって、『script』ってつくだけに、PerlとかRubyとかあの辺専用な訳?Cとかでゴリゴリ書いたCGIプログラムはどうすいればいいのよ?
みたいな質問が出そうなので、補足しておきます。ハンドラ名は「cgi-script」ですが、スクリプト専用というわけではないので、Cでゴリゴリ書いたCGIプログラムも、AddHandlerでハンドラに割り当ててやれば問題なくCGIとして動作させることができる。
以下のようにC言語で超簡単なCGIを作ってみる。
[root@kagami tmp]# cat test_c.c #include <stdio.h> int main( int , char ** ); int main( int argc , char **argv ) { printf( "Content-type: text/html\n\n" ); printf( "Return knee-length socks.\n" ); }
で、これをコンパイルして実行してみる。
[root@kagami tmp]# gcc -o test_c.cgi test_c.c [root@kagami tmp]# ./test_c.cgi Content-type: text/html Return knee-length socks.
問題なく実行できている。ファイルの種類を確認しておこう。
[root@kagami tmp]# file test_c.cgi test.cgi: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
ちゃんと、バイナリーの実行ファイルになっていることがわかる。
では、これを /var/www/html/directoryA/ にコピーして、httpd.confを微妙に修正する。修正のポイントは、拡張子「.pl」に続けて、「.cgi」もCGIであることを通知するのである。
<Directory /var/www/html/directoryA>
Order Deny,Allow
Allow from All
Options +ExecCGI
AddHandler cgi-script .pl .cgi
</Directory>
これでApacheを再起動してCGIにアクセスしてみよう。 http://server/directoryA/test_c.cgi で「Return knee-length socks. 」というテキストが表示されれば成功。
コメント 0