6

/Context を介してアクセスできる多数の webapps を含む単一の Tomcat インスタンスがあります。Tomcat は httpd (実際には Debian Apache2) の背後にあり、各アプリ/コンテキストを提供する仮想ホストで構成されています。Tomcat 接続は mod_jk を使用します。

URL からコンテキストを削除することを気にしない場合、これは問題なく機能します。仮想ドメインのルートが要求されると、要求されたドメインは domain.com/Context にリダイレクトされます。

ただし、あるアプリでは、コンテキストを削除たいと考えています。これは、mod_rewrite を使用し、書き換えた URL を mod_jk に渡して、正しい Tomcat コンテキストに渡すことで実現できると思います。したがって、私の Debian Apache2 サイトで利用可能なファイルは次のようになります。

NameVirtualHost *

<VirtualHost *>
    ServerName domain.be

    DocumentRoot /home/webapp/app/static/domain/

    RewriteEngine on
    RewriteRule ^/(.*)$ /Context/$1 [L,PT]
    RewriteLog "/var/log/apache2/domain-rewrite.log"
    RewriteLogLevel 4

    JkLogFile     /var/log/apache2/domain-mod_jk.log
    JkLogLevel    debug
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkMount /Context w1
    JKMount /Context* w1
    JkOptions +ForwardURICompat

    ErrorLog /var/log/apache2/domain_error.log
    CustomLog /var/log/apache2/domain_access.log combined
    LogLevel warn

</VirtualHost>

ドキュメントによると、[PT] フラグと +ForwardURICompat オプションにより、書き換えられた URL が jk_mod に渡されるはずです。しかし、それは起こっていないようです。

URL は書き直されていますが、mod_jk がそれを無視しているように見えます。

何か案は?ちなみに、現在 mod_proxy は使えません。

ありがとう

4

5 に答える 5

4

@Josh、Tomcatがリダイレクトを実行する場合、このソリューションは機能しないと思います。これは、ログインを要求するアプリケーションなどの典型的なケースです。ユーザーが認証されていない場合、アプリは /login などにリダイレクトしますが、Tomcat は /context/login のように現在のコンテキストを追加するため、最後にコンテキストが URL に表示されます。

他の質問/回答で述べたように、mod-jk と tomcat 仮想ホストのみを使用することはオプションですが、アプリケーションを ROOT.war としてデプロイする必要がありますが、これはそれほど単純ではない可能性があります。アプリケーションを tomcat webapps フォルダーにドロップするだけで済む回避策がありますが、ここで説明したように、サーバーはアプリを少なくとも 2 回展開します。

RewriteRule[P] と JkOptions +ForwardURICompat が機能することができれば素晴らしいことですが、機能しません。ところで、私はこれをテストしましたが、自分のサイトを cnn.com にプロキシし、自分のサイト URL の下にそのページを取得したため、mod_proxy が機能することを知っています。以下は、プロキシが使用されていることがわかるリクエストのログです。

127.0.0.1 - - [15/Dec/2011:12:56:34 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/
127.0.0.1 - - [15/Dec/2011:12:56:34 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/ [OK]
127.0.0.1 - - [15/Dec/2011:12:56:49 --0500] [localhost/sid#1008ef278][rid#1009aaca8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/login
127.0.0.1 - - [15/Dec/2011:12:56:49 --0500] [localhost/sid#1008ef278][rid#1009aaca8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/login [OK]
127.0.0.1 - - [15/Dec/2011:12:57:15 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/j_spring_security_check
127.0.0.1 - - [15/Dec/2011:12:57:15 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/j_spring_security_check [OK]
127.0.0.1 - - [15/Dec/2011:13:08:41 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/
127.0.0.1 - - [15/Dec/2011:13:08:41 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/ [OK]
于 2011-12-15T18:30:23.743 に答える
2

元の回答はそのままにしておきますが、それは間違っています。これを行う適切な方法は、Tomcat VirtualHost を使用することです。

http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html

上記のリンクにある公式のウォークスルーは、まさに私が今まで何度か使用してきたものです。ここでそれを煮詰めようとはしません。

概念は Apache Vhost と同じです。仮想ホスト (例: 用) を作成し、その仮想ホスト用のアプリケーション ( ) にsomething.yourtdomain.comwebapp をデプロイすれば、準備は完了です。このように、既にwebapp がある場合は、別のドメインで別の webapp を使用でき、以前のものは影響を受けません。ROOT/ROOT

Nestor が述べたように、Apache 書き換えルールは、コンテキスト ルートに基づいてリンク/フォーム アクションなどを自動的に作成するタグ ライブラリやフレームワークなどを処理しません。この場合、正しいコンテキスト ルート ( /) が作成されます。

于 2012-06-16T17:35:11.227 に答える
2

私はこれを使って大成功を収めました:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(Context/.*)$
RewriteRule ^/(.*)$ /Context/$1 [P,L]

あなたの状況に関するメモ:

  • mod_proxy を機能させる必要があります[P]。そうしないと、無視され、リクエストがプロキシされる代わりに転送されます。これを回避する方法はありません。
  • +ForwardURICompatmod_jk の一部であり、書き換え後に有効になります。
  • mod_jk はリクエストを無視しています。RewriteCond/Context へのリクエストが書き換えられないようにするには、(上記) が必要です。

私は現在、mod_rewrite を使用せずに、代わりにmod_jk と Tomcat <Host>を使用してこれを行う方法を探しています。しかし、apache、mod_jk、および Tomcat ホストがうまく連携するのに問題があります。上記はうまくいくはずです。

于 2011-02-08T15:46:34.623 に答える
-1

以下のように、mod_jk の代わりに mod_proxy_ajp を使用します。

<VirtualHost *:80>
  ServerName domain.be

  DocumentRoot /home/webapp/app/static/domain/

  ...

  ProxyPass /Context ajp://localhost:8009/Context
  ProxyPass / ajp://localhost:8009/Context/

  ...
</VirtualHost>
于 2012-09-24T16:12:28.357 に答える