- 締切済み
mod_rewriteについて
Apacheのmod_rewriteを使って、aaa.cgiをいったんbbb.cgiにリダイレクトし、aaa.cgiの危険な関数を確認するためにソースコードをopen関数でチェックして、 問題がなければ、requireを使って$ENV{'REDIRECT_URL'}でaaa.cgiを読み込んであげるのですが、前者も後者もaaa.cgi/pathというようなPATH_INFOつきのアドレスだと、500 Internal server errorになってしまって表示できないのですが、解決方法はありますか? レンタルサーバー用のチェックシステムなんです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- asciiz
- ベストアンサー率70% (6803/9674)
>URL上はaaa.cgi/aaaとなっていても、rewriteでリダイレクト後の >requireではaaa.cgiを読み込んで、読み込んだ後、PATH_INFOを >aaa.cgi側でブラウザ側に表示できるようにしたいです。 例えば「http://domain/aaa.cgi/def」というURLがあったとき。 WebサーバがこのURLを表示しようとしたならば、実際のファイルを検索するので、aaa.cgiがファイルであるとわかり、"/def"の部分をPATH_INFOとするのです。 しかし、mod_rewrite がURLを読み込んだ時点では、REQUEST_URI に「aaa.cgi/def」という文字列が渡され、この文字列だけで判断しなければなりません。(ディスクを見に行きません) そして単なるパス文字列としてみた場合、aaa.cgiと言う「ファイル」があるのか、「aaa.cgi」と言うディレクトリがあってその下の「def」ファイル を挿しているのか、分かりません。 拡張子付きのディレクトリだって存在しますし、拡張子無しのファイル名だって存在するのですから。 …しかしこの指摘も的外れである可能性があります。 現状では、こちらが勝手に、あなたがどう間違っているか想像して、それを勝手に指摘しているだけなのです。 さらにその直し方を教えろだなんて、無茶もいいとこです。 あなたの書いた .htaccess ファイルを提示してもらわなければ具体的なアドバイスはできないでしょう。 (まあもちろん本当のドメイン名やCGIファイル名は伏せてもらって良いんですけども。)
- asciiz
- ベストアンサー率70% (6803/9674)
PATH_INFO がつくようなURLだと、 aaa.cgi が目的ファイルなのか途中フォルダなのか判別できなくて、mod_rewriteのマッチに失敗してるんだろうという想像はできます。(マッチ失敗→リダイレクト/URL書き換えが行われない) "aaa.cgi" があればそこでマッチ終了するような正規表現を書けば良いと思いますが、あなたがどう書いたかわからないので何とも。
補足
aaa.cgiをrequireで読み込んで、PATH_INFOの部分をaaa.cgi側に記述したソースで表示したいです。 URL上はaaa.cgi/aaaとなっていても、rewriteでリダイレクト後のrequireではaaa.cgiを読み込んで、読み込んだ後、PATH_INFOをaaa.cgi側でブラウザ側に表示できるようにしたいです。
補足
apacheのバーチャルホストです。 <VirtualHost *:80> ServerAdmin アドレス DocumentRoot "ルート" ServerName サーバーネーム ErrorLog "エラーログフォルダー" CustomLog "アクセスログフォルダー" combined FileEtag None RequestHeader unset If-Modified-Since Header set Cache-Control no-store <Directory "表示ディレクトリ"> ErrorDocument 403 403 ErrorDocument 404 404 ErrorDocument 500 500 Options FollowSymLinks Includes AllowOverride all Require all granted #AddHandler cgi-script .cgi AddOutputFilter INCLUDES .shtml AddOutputFilter SUBSTITUTE html htm DirectoryIndex index.html index.htm index.shtml </Directory> Alias /cgi-bin CGI動作ディレクトリ ErrorLog "エラーログ" CustomLog "アクセスログ" combined <Directory "ディレクトリ"> ErrorDocument 403 403 ErrorDocument 404 404 ErrorDocument 500 500 Options FollowSymLinks ExecCGI Includes AllowOverride all Require all granted AddHandler cgi-script .cgi AddHandler application/x-httpd-php .php AddOutputFilter INCLUDES .shtml AddOutputFilter SUBSTITUTE html htm cgi php RewriteEngine on RewriteRule ^.+\.cgi(.*?)$ /error/function.cgi?directory=(ディレクトリ)&$1 [L] DirectoryIndex index.html index.htm index.shtml index.cgi index.php </Directory> Alias /error /Users/アカウント/Sites2/error ErrorLog "/エラーログ" CustomLog "アクセスログ" combined <Directory "/Users/アカウント/Sites2/error"> ErrorDocument 403 403 ErrorDocument 404 404 ErrorDocument 500 500 Options FollowSymLinks ExecCGI Includes AllowOverride all Require all granted AddHandler cgi-script .cgi AddHandler application/x-httpd-php .php AddOutputFilter INCLUDES .shtml AddOutputFilter SUBSTITUTE html htm cgi php DirectoryIndex index.html index.htm index.shtml index.cgi index.php </Directory> </VirtualHost> RewriteRuleでCGIファイルが読み込まれたら、function.cgiにリダイレクトして、function.cgiでリダイレクト前のcgiを読み込んで、危険な関数を発見したらエラー文を表示して、問題がなかったらrequireでリダイレクト前のCGIを呼び出すといったことです。 open関数でチェックしようとしたら、aaa.cgi/pathというようなURLですと、REDIRECT_URLで読み込んだ時に、/pathまで受け取ってしまい、エラーが出てしまうのですよ。 $ENV{'REDIRECT_URL'} =~ s/\/.$//g;でPATH_INFO消すとrequireで読み込んだ時にPATH_INFOをaaa.cgi表示時に、aaa.cgi内に記述した$ENV{'PATH_INFO'}でURL上の/pathなどの文字列が表記できないのです。?以降はできるんですけどね。