- ベストアンサー
WEBサーバーのapacheの設定について
WEBサーバーをたてていますがつまってしまい困っています。 困っているのは、apache2.2系のルートディレクトリでディレクトリを指定するのではなく、プログラムファイルを指定できないことです。 つまりweb上からあるディレクトリの中の複数のファイルに直接アクセスするのではなく、必ずあるCGIファイルを通して間接的にアクセスしたいのです。 apache2.2におけるその方法がわからなくて困っています。 本当に困っています。 誰かご教授下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
/var/www/test がドキュメントルートだとして、entrance.cgi にだけアクセスさせたい、他にアクセスしてきたら entrance.cgi に強制的に飛ばす(他ファイルにアクセスさせるのは entrance.cgi が行う場合) <Directory "/var/www/test"> ErrorDocument 403 /entrance.cgi Order deny,allow Deny from all </Directory> <Files "entrance.cgi"> Allow from all </Files> ------------------------- entrance.cgi で認証したばあいだけほかへの直接アクセスを許可したい(アクセスは Apache にまかせて、認証だけ entrance.cgi でやる) <Directory "/var/www/test"> SetEnvIf Cookie oreoreyou=password&nekoneko login_ok ErrorDocument 403 /entrance.cgi Order deny,allow Deny from all Allow from env=login_ok </Directory> <Files "entrance.cgi"> Allow from all </Files> ↓ entrance.cgi #!/usr/bin/perl use strict; use CGI::Simple; my %CONFIG = ( SCRIPT_URI => 'http://なんとかかんとか/entrance.cgi', LOGIN_PASSWORD => 'nekoneko', COOKIE_NAME => 'oreoreyou', ); my $q = CGI::Simple->new; my $password = $q->param('password'); if (defined $password) { print $q->redirect( $CONFIG{SCRIPT_URI}, -cookie => $q->cookie( -name => $CONFIG{COOKIE_NAME}, -value => { password => $q->param('password') }, expires => '+10d', ) ); return; } print $q->header; print << 'HTML'; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Login</title> </head> <body> HTML my %cookies = $q->cookie($CONFIG{COOKIE_NAME}); if (%cookies and $cookies{password} eq $CONFIG{LOGIN_PASSWORD}){ print '<p>ok</p>'; } else { print <<"HTML"; <form method="post" action="$CONFIG{SCRIPT_URI}"> <p><input type="password" name="password" value="" /><input type="submit" value="Login" /></p> </form> HTML } print << 'HTML'; </body> </html> HTML 文字数増えすぎてもなのでハードコード過ぎますがご了承を。 インデント崩れるので全角スペースで埋めてます、コピペ時は注意で。 ちゃんと動くかは試してません。
その他の回答 (3)
先に上げた例だと、環境変数 REQUEST_URI で本来の呼び出し先を取得できます。 以下は予想での補足になりますが 直リンクさせたくないために CGI 経由するといった理由だと、直接ファイルの URL 叩いてアクセスできちゃうと意味がないので何らかのアクセス制限をする事になります。 ここで CGI から目的ファイルへリダイレクトしたときに、CGI から来ているとという証拠が Apache からわからないとまたアクセス制限がかかるのでどうしょうもないです。 なので、クッキーを焼くサンプルを付けたのですが・・・ ほかには CGI で直接ファイルを吐き出させるとか リファラを見るとか(リファラ切ってる人多いのでお勧めしません)
補足
丁寧な説明ありがとうございます。 アクセスを一つに集めたいのは処理が後々楽だったり、セキュリティーだったり、SEOだったりと諸々考えています。 イメージとしてはpassでそれぞれのplファイルをrequireしてhtmlを吐き出す感じなんです。 で、提案頂いた方法ではSEO的にどうなのか少し不安であったので…。 すいません完全にこちらの説明不足で。。。
直接的に の意味がちょっとわかりかねますが、リダイレクトではありません。 エラードキュメントとして表示するので、ブラウザのURL欄はかわりません。ユーザーは、entrance.cgi に飛ばされたことさえ気づかないはずです。 ちなみに、 ErrorDocument 403 http://...../entrance.cgi としてしまうと、リダイレクトになるので注意。
お礼
すいません、こちらの説明不足で。 実はそのcgiで色々なプログラムに飛ばしたいと考えています。 たとえばパスにAがあればAというプログラムえ飛ばしBがあればBというプログラムえ飛ばすといったことをしたいと思っています。 なのでエラードキュメントとして処理をしたくなくて…。 すいません、説明不足で。
-value => { password => $q->param('password') }, は -value => { password => $password }, の間違いでした、そのままでも動くとは思いますが。
お礼
ありがとうございます!!!! この方法だとリダイレクトで飛ばしていると思うのですが、強制ではなく直接的に飛ばす方法がないのでしょうか? apache1.X系だとhttpd.confの<Directory…以下にActionを書く方法があると思うのですが、それに似たような方法で…。