-1

私はApache+Tomcatをいじくり回して、apache(クリーンで鮮明なURLロック)を介して(異なるマシンで)複数のtomcatアプリを提供できるようにしています。構成に成功し、2つのTomcatアプリを異なるマシンでほとんどmod_proxy_ajp問題なく提供できるようになりました。mod_rewrite

私が見つけた唯一の問題は、(Struts2で開発している)アプリの1つに、タグとタグで生成されたリンクとフォームがたくさんある<s:a />こと<s:url />です<s:form />。これらのタグによって生成されるURLは、通常、次のようになります。

/WebApp/path/to/some.action

ModRewriteの魔法のおかげで、これは一般的に大きな問題ではなく、そのようなURLへのハイパーリンクはすぐに書き直されてリダイレクトされ/app/path/to/some.actionます(私はたくさんの302応答を受け取りますが)。

実際の問題は、POST要求を実行するときに発生します。ご存知かもしれませんが、POSTmod_rewriteを使用してリクエストをリダイレクトすることはできません...したがって、最終的には... POSTmod_rewriteが正しいURLにリダイレクトするため、リクエストとしてすべてのリクエストが機能しませんGET

mod_proxy_htmlTomcat Webアプリケーションによって返されるURLを書き直すのにどのように役立つかについては、すでに少し読んでいますが、面倒な感じがします。

これは私の現在のapache構成です:

## HACKING BEGINS RIGHT HERE

# cookies
ProxyPassReverseCookiePath /WebApp /app
# this is for CSS, IMGs, JS and redirecting urls with /WebApp*
RewriteRule ^/WebApp(.*)$ /app$1 [R,L]
<Location /app>
    ProxyPass ajp://localhost:8009/WebApp
    ProxyPassReverse ajp://localhost:8009/WebApp
    Order allow,deny
    Allow from all
</Location>

# the other app
ProxyPassReverseCookiePath /WebApp2 /other
<Location /other>
    ProxyPass ajp://200.9.4.6:8009/WebApp2
    ProxyPassReverse ajp://200.9.4.6:8009/WebApp2
    Order allow,deny
    Allow from all
</Location>

私のPOST要求の問題に対する解決策がなければなりません...何かアイデアはありますか?Struts2が正しいURLを出力できるように何かを構成できますか?

ご協力いただきありがとうございます。

4

3 に答える 3

0

これは webapp のセットアップの問題です。httpd 設定でこれを回避する方法があるかもしれませんが、ハッキングするよりも元の矛盾を修正する方がクリーンです。

また、Struts は、コンテキストを認識した非相対 URL を提供することで、ユーザーを支援しようとしていることにも言及する価値があります。パスを一致させるだけであれば、(それと戦う代わりに...)それに頼ることができます。

したがって、Struts webapp を /WebApp と /WebApp2 ではなく、/app と /other にデプロイするだけです。(他のサーバーを実際に制御していない場合など、これが不可能な理由があるかもしれませんが、それは当てはまらないようです)。

于 2012-06-29T20:46:34.930 に答える
0

これにはいくつかの方法があるかもしれません。

URL で使用しているのと同じ名前でアプリを Tomcat にデプロイできる場合は、それが最も簡単です。したがって、アプリケーションapp/webapps/app[.war]の代わりになり/webapps/WebAppます。これにより、書き換えが完全に回避されます。

それ以外の場合は、以下が機能し、現在の書き換えルールの前に配置する必要があります。は、Apache が引き続きリクエストをプロキシできるようにする必要があります (これは を使用している場合に機能し[PT] ますmod_jkが、使用/テストしたかどうかはわかりませんmod_proxy_ajp):

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/WebApp(.*)$ /app$1 [PT,L]

Bean が POST リクエストを処理したら、リダイレクトされる URL にリクエストを送信できます。結局、POST URL はユーザーにとって重要ではないため、きれいな URL である必要はありません。

以下の編集:

Apache mod_proxy で、ProxyPassReverse が[PT]フラグで動作することを確認しました。そして、私はあなたが抱えている問題を再現することができました。以下の構成は、別の JSP ページに投稿されたフォームを含む基本的な JSP ページで機能しました。

<VirtualHost *:80>
    ServerName localhost
    RewriteEngine On

    RewriteCond %{REQUEST_METHOD} !POST
    RewriteRule /WebApp/(.*) /app/$1 [R,L] 

    RewriteCond %{REQUEST_METHOD} POST
    RewriteRule /WebApp/(.*) /app/$1 [PT,L]

    <Location /app>
        ProxyPass ajp://localhost:8109/WebApp
        ProxyPassReverse ajp://localhost:8109/WebApp
    </Location>
</VirtualHost>
于 2011-03-30T14:29:24.747 に答える
-1

URL の書き換えは避けたいと思います。このようなワームの缶を開けたり、mod_proxy_html を調べさせたりするだけです。もちろん、これらはさらに多くのワームです。代わりに、Tomcat にアプリをデプロイするだけで、外部から見えるように使用できる実際の URL を使用できます。

于 2012-09-30T22:41:15.443 に答える