これが怖いの自分だけ?というものありますか?

どなたか,ご教授いただければ幸いです。
WindowsXp Proでapacheを動かしています。次の設定で,cgiはうまく動作していました。
---
<IfModule alias_module>
ScriptAlias /cgi-bin/ \"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/\"
</IfModule>

<Directory \"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin\">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
AddHandler image/gif .gif
AddHandler image/jpeg .jpg
</Directory>
---
これに,
http://www.miloweb.net/win/server/apache.html
を参考にして,各ユーザーフォルダでcgiが実行できるようにしようと,次のようにしました。
---
<IfModule alias_module>
ScriptAlias /cgi-bin/ \"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/\"
ScriptAlias /cgi/ \"C:/www/users/*/cgi/\"
</IfModule>

<Directory \"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin\">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
AddHandler image/gif .gif
AddHandler image/jpeg .jpg
</Directory>

<IfModule mod_userdir.c>
UserDir \"C:/www/users/*/\"
</IfModule>

<Directory \"C:/www/users/*/cgi/\">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
AddHandler image/gif .gif
AddHandler image/jpeg .jp
</Directory>
---

その結果,
http://localhost/~user/
としてuserのホームページにアクセスできるようになったのですが,
cgiについては,
http://localhost/~user/cgi/・・・
としてもアクセスできません。どなたか原因をご教授いただけないでしょうか。

ScriptAlias /cgi-bin/ \"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/\"
ScriptAlias /cgi/ \"C:/www/users/*/cgi/\"
の行を入れ替えると,\"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/\"においてあるcgiが実行できなくなります。ScriptAliasは1行目しか有効でないようにも見えるのですが,上に書いた参考URLではできているようなので,戸惑っています。

A 回答 (2件)

 ええ? そんな馬鹿な、と思いつつ実際にWindows Server 2003にApache 2.2.14(nossl)とActivePerl5.10.1.1006を入れてみた。



私が書いた
ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi/(.+) \"C:/www/users/$1/cgi/$2\"
ではダメでした。すみません。
ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi/(.+) "C:/www/users/$1/cgi/$2"
だとうまくいった。円マークが余計でした。これで普通に動きます。

動かしたCGIはこれ
#!c:/Perl/bin/perl
print "Content-Type: text/plain\r\n\r\nhello";

~~~~~

> 一つ教えてください。
> ScriptAliasでなく,ScriptAliasMatch を使わなければならない
> 理由はどのようなことでしょうか?
ScriptAlias /cgi/ \"C:/www/users/*/cgi/\"
がなぜいけないかだけど、これだとそもそも「*」の部分を誰がどう置き換えるのか分からない。Apacheがhttp://localhost/cgi/hello.cgiに対して、C:/www/users/anmochi/cgi/hello.cgiからC:/www/users/bob/cgi/hello.cgiから何から探しにいくのかという話。ひょっとしたら1.3ではうまく動いていたのかも知れないけど、2.2では動かない。

~~~~

 さて、余談にはなるけど、最終的にお友達なんかにこのサーバーのusersを間借りさせてあげるような場合、ScriptAliasMatchも実はあまりお勧めできない。ScriptAliasはそろそろお役ご免なのではないかと個人的には思います。

お勧めの構成は以下のような感じ。

UserDir "C:/users/"
<Directory "C:/users/*">
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Order Allow,Deny
Allow from All
</Directory>
<Directory "C:/users/*/cgi">
AllowOverride None
AddHandler cgi-script .cgi
Options ExecCGI
</Directory>

 つまり、ScriptAliasやScriptAliasMatchで「スクリプト実行用の場所を指定する」のではなく、「特定の場所のみスクリプトの実行を許可する」方法。ScriptAliasはその場所の全てのファイルがスクリプト対象になって、除外したいファイル(gifやhtmlなど)をあえて除外しないといけないなど、設定をがちがちにしないとすぐセキュリティ上のリスクになる。そこで、C:/users/*/cgiの中に置いてかつ拡張子がcgiのファイルだけをCGIとして扱うようにする。もちろんAddHandlerをSetHandlerにする事でScriptAliasとほぼ同等の状態にできる。AddHandlerの拡張子を増やしても良いだろう。
 ~hogehoge以下のURLへのマッピングはUserDirだけで済むし、後はDirectoryに対してこつこつアクセス制御を割り当てていくだけなので凄く楽チンだとは思わないかねチミィ。UserDirもAliasもAliasMatchも、UNIXで言うところのマウントと同じでディレクトリツリーの一部分を切り貼りするためのもので、この機能は必要最小限に使うのがうまく管理するコツだと私は思う。下手に増やすとループしたりアクセス制御の漏れが出たり大変です。あるサブツリー以下を誰かに委任してて、その数が増えるとなおさら大変です。

 設定も構造もできるだけ単純化する方が良いと思いますです。今回のようなUserDir+SetHandlerとUserDir+ScriptAlias(Match)であれば、前者の方が単純っしょ。AliasMatchも多用するならmod_rewriteに替えた方がlogの管理まで考えたら良いはず。
    • good
    • 0
この回答へのお礼

大変,丁寧に書いていただき,ありがとうございます。
円マークは気がついて削除して試したのですが,再度確認してみます。
ここまで書いていただいたのに,動かさないわけにはいかないので,
ちょっとお時間かかるかもしれませんが,頑張ってみます。

お礼日時:2010/01/27 22:58

 質問者さんの参照URLはApache 1.3の話で、質問者さん自身はApache 2.2を使用されているように見受けられます。

メジャーバージョンが2つも離れています。Windowsで言えばWindows NT 4.0の操作説明でWindows XPを操作するようなものです。

試しに
ScriptAlias /cgi/ \"C:/www/users/*/cgi/\"

ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi/(.+) \"C:/www/users/$1/cgi/$2\"
に変えてみてください。ただし、ユーザー名に!や#などの記号が含まれているとうまく動きません。

 余計なアドバイスですが、もう少しディレクティブの意味をしっかり勉強された方が良いと思います。ネットで拾ってきたサンプルを切り張りして、動いたから良いや、ではトラブルがあったときに自分では何の対処もできないという状況になりかねません。

この回答への補足

ご教授いただきありがとうございます。
バージョンが異なる件は,私のミスです。申し訳ありません。

>余計なアドバイスですが、もう少しディレクティブの意味をしっかり勉強された方が良いと思います。

まさにその通りでお恥ずかしい限りです。申し訳ありません。
一度は一通り読んだのですが,かなり前のことで忘れています。

一つ教えてください。
ScriptAliasでなく,ScriptAliasMatch を使わなければならない
理由はどのようなことでしょうか?

補足日時:2010/01/05 02:26
    • good
    • 0
この回答へのお礼

ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi/(.+) "C:/www/users/$1/cgi/$2"

としてみましたがダメでした。
この表現はapacheのhpにも出ていました。
usersは,アルファベットのみです。
"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
においたcgiは動作するんですが,
"C:/www/users/cgi/"においたcgiは動作しません。
他に,お気づきの点があれば,教えていただけないでしょうか。

お礼日時:2010/01/05 02:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報