• 締切済み

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になってしまって表示できないのですが、解決方法はありますか? レンタルサーバー用のチェックシステムなんです。

  • CGI
  • 回答数2
  • ありがとう数0

みんなの回答

  • asciiz
  • ベストアンサー率70% (6630/9393)
回答No.2

>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ファイル名は伏せてもらって良いんですけども。)

humu01jp
質問者

補足

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などの文字列が表記できないのです。?以降はできるんですけどね。

  • asciiz
  • ベストアンサー率70% (6630/9393)
回答No.1

PATH_INFO がつくようなURLだと、 aaa.cgi が目的ファイルなのか途中フォルダなのか判別できなくて、mod_rewriteのマッチに失敗してるんだろうという想像はできます。(マッチ失敗→リダイレクト/URL書き換えが行われない) "aaa.cgi" があればそこでマッチ終了するような正規表現を書けば良いと思いますが、あなたがどう書いたかわからないので何とも。

humu01jp
質問者

補足

aaa.cgiをrequireで読み込んで、PATH_INFOの部分をaaa.cgi側に記述したソースで表示したいです。 URL上はaaa.cgi/aaaとなっていても、rewriteでリダイレクト後のrequireではaaa.cgiを読み込んで、読み込んだ後、PATH_INFOをaaa.cgi側でブラウザ側に表示できるようにしたいです。

関連するQ&A

  • mod_rewriteについて教えてください。

    mod_rewriteについてお願いします。 「a」と「b」というフォルダにそれぞれ「index.html」「test.html」が入っています。「a」と「b」で「index.html」「test.html」の内容はちがいます。 わたしが一番望んでいるのは http://example.com/a/以下にアクセスがあった場合 http://example.com/b/以下にリダイレクトさせるというものです。 例) http://example.com/a/test.htmlにアクセスがあったらhttp://example.com/b/test.htmlにリダイレクト。 ------------------------------------------------------------ Options +FollowSymLinks AddHandler cgi-script htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/a/$ /b/$1 [R=302,L] </IfModule> ------------------------------------------------------------ としてみましたが、リダイレクトされません。 ちなみに RewriteRule ^$ /b/$1 [R=302,L] と書くと、http://example.com/にアクセスがあった場合 http://example.com/b/にリダイレクトされましたので mod_rewriteには対応しております。 ご教授のほど、よろしくお願いいたします。

  • mod_rewriteが効かない!

    サーバの運用上、mod_rewriteを使う必要が出来たので設定してみたのですが効きません。 FreeBSD4.11+Apache1.3.33で httpd.confファイルに直接書き込んで試しています。 LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c のどちらも書いてあるにもかかわらず、下記のテスト設定を試してみたらローカルIPからアクセス出来てしまいます。 RewriteEngine on RewriteCond %{REMOTE_ADDR} ^192\.168\.1\. ←ローカルネットワークのアドレス RewriteRule ^.*$ - [F] どのようにしたらいいですか? アドバイスお願い致します。

  • mod_rewriteについて

    初めて質問させていただきます。 よろしくお願いします。 Solaris8にてApacheを動かしています。 【問題】「HTTP TRACE」を拒否するためにmod_rewriteモジュールをインストールしようと思うのですがうまくいきません。 【詳細】mod_rewriteをインストールするとmod_soが消えてしまい、mod_soを入れなおすとmod_rewriteが消えてしまいます。  ./configure --enable-module=so --enable-module=rewrite とすると両方が入るみたいなんですが、 /usr/local/apache/bin/apachectl startssl としても、  Syntax error on line 206 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/libexec/libssl.so into server: ld.so.1: /usr/local/apache/bin/httpd: 重大なエラー: 再配置エラー: ファイル /usr/local/apache/libexec/libssl.so: シンボル ap_global_ctx: 参照シンボルが見つかりません。 /usr/local/apache/bin/apachectl startssl: httpd could not be started と、こんなエラーが出てhttpdがスタートできません。 どこに原因があるためのエラーなのでしょうか??

  • mod_rewriteの相対パス

    いつもお世話になっております。 mod_rewrite を使ってパスの書き換えを行いたいと思っております。 以前にも mod_rewrite について質問させていただいたのですが 違う方法で解決できました。 画像ファイル等のRewriteRule を教えていただきたく質問させていただきます。 例えば・・・ http://domain.jp/a.php?id=111 を http://domain.jp/a/id/111 に書き換えた場合、階層が深くなるため画像が表示されなくなります。 a.php の中には以下のような画像ファイルの記述があります。 <img src="./img/aaa.jpg"> <img src="./img/bbb.gif"> できれば、RewriteRule を使って画像ファイルのパスを書き換えたいと 思っております。 どのようなルールを書けばよろしいでしょうか。 それとも絶対パスじゃないと無理なのでしょうか。 ご教授お願いいたします。 よろしくお願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

  • mod_rewrite設定について

    mod_rewrite設定について mod_rewriteでcgiに渡す引数の一部のみを書き換えることは可能でしょうか。 具体的には下記のような挙動を実現したいです。 http://mydomain.com/test.cgi?status=true&action=1 ↓ http://mydomain.com/test.cgi?status=false&action=1 2つ目の引数は複数のパターンが想定されています。 下記のようなrewriteの設定を試してみましたが リダイレクトされませんでした。 ~~~~~~~~~~~~~~~~~~~~~ RewriteEngine on RewriteRule ^/test.cgi?status=true(.*) http://mydomain.com/test.cgi?status=false$1 [QSA] ~~~~~~~~~~~~~~~~~~~~~ 助言をいただけないでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • mod_rewriteの環境変数を埋め込みたい

    お世話になります。 現在、以下の環境でWebアプリケーションを開発しています。 CentOS5.4 Apache2.2.3 Tomcat7 JavaSE6 ApacheとTomcatの連携にmod_proxy_ajpモジュールを使用しています。 ただ、クライアントからアクセスするURLと連携先のURLが異なるため、Java側でHttpRequestからコンテキストパス以降を取得するとajp連携されたパスしか取得できず、クライアントがアクセスしたURI情報が取得できません。 これを対策するために、Apacheモジュールのmod_rewriteとmod_headersを利用して、 クライアントがアクセスしたURIをリクエストヘッダに埋め込もうとしています。 以下httpd.confに追加した設定です。 (rewrite.confも試しました) RewriteEngine On RewriteRule .* - [E=ORG_QUERY_STRING:%{QUERY_STRING}] RequestHeader append "test_query_string" %{ORG_QUERY_STRING}e 設定後、Apacheを再起動してWebアプリケーションにアクセスすると、リクエストヘッダ自体は追加されているのですが値が(null)となってしまい取得できません。 mod_rewriteの環境変数が取得できていないのかと思い、 RewriteRule .* - [E=ORG_QUERY_STRING:TEST] と固定文字列を埋め込んでも取得できませんでした。 このことからENVによる環境変数への設定、または参照が出来ていないのかと思われますが、どうにも解決できません。 参照時に RequestHeader append "test_query_string" %{ENV:ORG_QUERY_STRING}e としても同様の結果でした。 心当たりのある方、またはデバッグ方法や別解などアドバイスを頂けないでしょうか? なお、httpd.confではmod_rewrite、mod_headersのモジュール定義は有効となっております。 また、環境変数のスペルミスもコピペして確認しております。

  • apacheにおいてmod_rewriteのRewriteRuleを動的に設定したい

    apache2.xにおいて、mod_rewriteを用いて URLの動的な書き換えを行っていますが、 正規表現ではなく、URLの一部を用いて、外部(DB等)に問い合わせて、 その結果を元に書き換えができる方法を探しています。 例えば http://example.co.jp/aaa/ というURLにアクセスがあった場合、 aaaをキーにしてDBに問い合わせて、その結果を元に rewriteを行う、といったイメージです。 mod_rewriteのマニュアルを読んだのですが、 そのような事が出来そうな項目はありませんでした。 方法or代替策等ご存じの方 教えていただければと思います。

  • mod_rewriteについて

    SEOに効果があるのかも賛否両論ですが.htaccessに以下のような指定で 拡張子がphpのものをhtmlに変更しました。 RewriteRule ^([A-Za-z0-9]+).html$ $1.php [L] ○○.htmlにアクセスがあれば実際には○○.phpを表示させるという ことで成功はしたのですが○○.phpにアクセスしても普通にページが 表示されてしまいます。 ロボットがきてhtmlとphpと同内容があればなにか問題があるのかと 思い(根拠がない勝手な妄想ですが)○○.phpにアクセスがあれば実際に 表示するのは○○.phpですが○○.htmlへリダイレクトさせたいと 思っているのですがどうやれば可能でしょうか? また実際にサーバーにアップしてあるファイルの拡張子はphpなので すがmod_rewriteでこのような設定をしただけでロボットにhtmlとして 認識されるのでしょうか? mod_rewriteは初めて使うもので希望の動作に必要性があるのかすら よくわからない状況なのですが詳しい方がおりましたら是非ご教授を お願い致します。

  • mod_rewrite / RewriteRule について教えて下さい

    私はプログラムが専門なのでmod_rewrite等サーバー関連に疎く、かなり調べましたがこれといった情報が見つからず質問させて頂きます。 まず、.htaccessにて RewriteRule ^(.*)/$ $1.php と記載しており、 http://www.foo.com/bar/ → http://www.foo.com/bar.php に置き換えております。 この部分については思った通りに置換されておます。 しかし http://oshiete1.goo.ne.jp/qa2509320.html こちらにも書かれてますように、HTML内の画像ファイルへの参照が相対パスで書かれておりますので、RewriteRuleを上記設定にすることでディレクトリ階層がズレてしまいます。 http://oshiete1.goo.ne.jp/qa2509320.html には「画像のパスも mod_rewrite で書き換えるというのが一番スマートのような気がします。」とありますが、その具体的な方法がこのQAには記載されておらず、どうやって書いたら良いか分からないでおります。 知りたいのはパスを置き換える.htaccessへの具体的な記述方法です。 今回、画像・CSS・JavaScriptが全て外部ファイルになっており、HTML側では全て相対参照で指定されております。 SVNによる複数人開発のため絶対パスの指定が出来ませんので、相対指定で何とかならないものかと試行錯誤しております。 OSはCentOS4.3です apacheはyumでインストールしたものでhttpd-2.0.52-28となっております。 宜しく御願いいたします。

  • mod_rewriteでの'?'表示

    http://www.example.com/search.cgi?a=mypage&b=go&c=1&d=2 を、 http://www.example.com/mypage/go/search?c=1&d=2 に変えたいですが、どのようにすればよいのでしょうか? htaccessでは・・・ Options +FollowSymlinks RewriteEngine on RewriteRule ^/([0-9A-Za-z]+)\/([0-9A-Za-z]+)\/search?c=([0-9A-Za-z]+)&d=([0-9A-Za-z]+)$ /search.cgi?a=$1&b=$2&c=$3&d=$4 [L] にしてもアクセスできません… APACHEマニュアルでは「?」は文字数指定と言う文法に なるらしく、「?」を表示させたいです。 http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule どうすればよろしいでしょうか?ご教示ください。

専門家に質問してみよう