Mod_proxyを使用してApachehttpdの背後にあるTomcatアプリサーバーのかなり一般的なセットアップがあります。私の仮想ホストは次のようになります:
<VirtualHost test.example.be:80>
ServerName test.example.be
RewriteEngine on
RewriteRule ^/test/(.*)$ /$1
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8181/test/
ProxyPassReverse / http://localhost:8181/test/
</VirtualHost>
Tomcatにデプロイされたアプリケーション「test」は、コンテキストを認識するフレームワーク(Spring Security)を使用するため、リダイレクト時にコンテキストルートを付加します。したがって、ルートにあるfoo.htmlというページにリダイレクトすると、bleh://test.example.com/test/foo.htmlにリダイレクトされます。このURLは存在せず、404を返します。コンテキストルートの先頭を制御できないため、コンテキストルートを削除することでmod_rewriteを使用してこれを回避できると思いました。残念ながら、これは機能しません。RewriteRuleが完全に無視されるかのようです。
奇妙なことに気づきました。bleh://test.example.com/test/foo.htmlのリクエストはTomcatにも転送されません。Apachehttpdからおなじみの404ページを取得します。 bleh://test.example.com/jfaklkfdjljfklのような他の偽のURLを入力すると、Tomcatから404ページが取得されます。 bleh://test.example.com/test/foo.htmlがbleh:// localhost:8181/test/test/foo.htmlへの呼び出しを生成することを期待しますが、明らかにここに何かが欠けています。
私はこれらの問題の専門家からはほど遠いので、どんな助けでも大歓迎です。
[〜#〜] update [〜#〜]
私はこの問題についていくらかの進歩を遂げました。 mod_rewriteからのデバッグ出力をログに記録することが可能であると言われたので、まさにそれを行いました。以下は、それらのログの関連部分です。
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) init rewrite engine with requested uri /test/notify
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (3) applying pattern '^/test/(.*)$' to uri '/test/notify'
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) rewrite '/test/notify' -> '/notify'
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) local path result: /notify
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) prefixed with document_root to /usr/local/Apache/htdocs/notify
[12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (1) go-ahead with /usr/local/Apache/htdocs/notify [OK]
したがって、ここで起こっていることは、mod_rewriteが実行すべきことを正確に実行しているということですが、何らかの理由で、ApacheはURLをmod_proxyに渡さず、代わりに/ usr/local/Apache/htdocsを付加して、それを解決しようとします。したがって、新しい質問は、Apacheに/ usr/local/Apache/htdocsを付加せずに、URLをTomcatに渡すにはどうすればよいですか?
PS:投稿できるリンクの数が明らかに限られているため、いくつかの場所で「http」を「bleh」に置き換える必要がありました。
[P]
要求をmod_proxyに渡すためのフラグ:
RewriteRule ^/test/(.*)$ http://localhost:8181/$1 [P]
DocumentRootを先頭に追加しない正しい方法は、RewriteBaseディレクティブを使用するか、PT(PassThrough)フラグを書き換えルールに追加することです。ここを参照してください-httpd.Apache.org/docs/current/rewrite/flags.html#flag_pt