web-dev-qa-db-ja.com

AJPがTomcatへのすべてのリクエストを処理しているときに、一部の書き換えルールが失敗するのはなぜですか?

Mod_proxy_ajpを使用してJboss/Tomcat5.5にすべてのリクエストを処理させるApacheサーバーがあります。これが私がApache2.2.17を設定した方法であり、ほとんどの場合、それは機能します:

# Proxy pass all work to Tomcat, mod_jk 1.2.31
<Location />
    # ProxyPass / http://localhost:8080/
    ProxyPass ajp://localhost:8009/
    ProxyPassReverse ajp://localhost:8009/
</Location>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
#  and , to handle the redirect of the root dir
Redirect permanent / https://%{HTTP_Host}%/myapp

残念ながら、ProxyPassが有効になっている間、上記のルールを除いてmod_rewriteルールを機能させることができません。この状況にどのように対処しますか?

このRedirectMatchルールに似た書き換えルールを作成しようとしています(ProxyPassをオフにした場合にのみ機能します)。

RedirectMatch ^/(?i)myagency   "/myapp?agency=MyAgency%20LA"

また、私の問題への洞察を提供するかもしれない、私が見つけた別の奇妙なものが投稿されています ここ

1
djangofan

わかりました、私はついにそれを自分で理解しました。 AJPプロトコルはHTTPタイプのルールとは動作が異なるため、混在することはありません。それを解決するには、すべてをAJPにリダイレクトするのをやめ、代わりにAJPのみを使用してアプリケーションをリダイレクトする必要がありました。答えは次のとおりです。

# don't ProxyPass through the "/" dir location,
# since it breaks the mod_rewrite rules
<Location /myapp>
    ProxyPass ajp://localhost:8009/myapp
    ProxyPassReverse ajp://localhost:8009/myapp
</Location>
RewriteEngine On
# rule to redirect from http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
# rule to redirect /  to the app context since nothing is served at /
Redirect /  /myapp?name=
# supplemental rules to handle URI shortcuts
RedirectMatch ^/(?i)name1   /myapp?name=NameOne
RedirectMatch ^/(?i)name2   "/myapp?name=Name%20Two"
2
djangofan

次のように、[P]を使用してリクエストをプロキシする代わりに、ProxyPassディレクティブとProxyPassReverseディレクティブをRewriteRuleディレクティブに変換できます。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
RewriteRule (.*) ajp://localhost:8009/$1 [P]
1
walkeran