Назад | Перейти на главную страницу

Почему некоторые правила перезаписи не работают, когда AJP обслуживает все мои запросы к Tomcat?

У меня есть сервер Apache, использующий mod_proxy_ajp, чтобы Jboss / Tomcat5.5 обрабатывал все запросы. Вот как я настроил Apache 2.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"

Кроме того, опубликована еще одна странная вещь, которую я обнаружил, которая может пролить свет на мою проблему. Вот .

Хорошо, наконец-то разобрался для себя. Протокол 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"

Вместо этого вы можете преобразовать директивы ProxyPass и ProxyPassReverse в директивы RewriteRule, используя [P] для проксирования запроса, например:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteRule (.*) ajp://localhost:8009/$1 [P]
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine On
RewriteRule  ^/$  /index.html  [L]

# RequestHeader set REMOTE_USER %{LA-U:REMOTE_USER}e
RewriteCond %{REQUEST_URI} !^/fusioncp
ReWriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^(.*) ajp://localhost:18009$1 [P]