- ベストアンサー
ApacheのScriptAliasの記述について
- WindowsXp Proでapacheを動かしています。
- http://www.miloweb.net/win/server/apache.htmlを参考にして、各ユーザーフォルダでcgiが実行できるようにしようとしましたが、うまくいかない状況です。
- ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"の行を入れ替えると、"C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"においてあるcgiが実行できなくなります。
- みんなの回答 (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の管理まで考えたら良いはず。
その他の回答 (1)
- anmochi
- ベストアンサー率65% (1332/2045)
質問者さんの参照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 /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は動作しません。 他に,お気づきの点があれば,教えていただけないでしょうか。
補足
ご教授いただきありがとうございます。 バージョンが異なる件は,私のミスです。申し訳ありません。 >余計なアドバイスですが、もう少しディレクティブの意味をしっかり勉強された方が良いと思います。 まさにその通りでお恥ずかしい限りです。申し訳ありません。 一度は一通り読んだのですが,かなり前のことで忘れています。 一つ教えてください。 ScriptAliasでなく,ScriptAliasMatch を使わなければならない 理由はどのようなことでしょうか?
お礼
大変,丁寧に書いていただき,ありがとうございます。 円マークは気がついて削除して試したのですが,再度確認してみます。 ここまで書いていただいたのに,動かさないわけにはいかないので, ちょっとお時間かかるかもしれませんが,頑張ってみます。