Как заставить tomcat 5.5 работать за Apache 2 с mod_rewrite, проходящим через запросы к mod_jk и очищающим контекст приложения?

Итак, я хочу, чтобы веб-приложение, работающее в tomcat (5.5), работало за Apache 2 (если быть точным, 2.2.3), обслуживая из корня сайта (то есть без контекста), со статическим контентом, обслуживаемым через apache.

Так что, если приложение работает под "/myappна tomcat я хочу использовать apache (плюс mod_rewriteчтобы заставить его вести себя так, как будто он работает под/вместо

Mod_jk настроен и работает нормально. Я могу получить доступ к приложению из "/myapp", но я не могу заставить работать последний бит. Ниже приведен конфиг mod_rewrite чтобы попытаться заставить это работать. Это правильно получает переписывает /static/ URL-адреса, чтобы получить Apache для обслуживания их из распакованного веб-приложения, и если я включаю журнал перезаписи, я вижу, что он пытается пройти через все другие запросы к /myapp с помощью mod_jk, Однако кажется, что mod_jk не обрабатывает запрос впоследствии.


JkMount /myapp/*      worker1

RewriteEngine On

# ensure static stuff gets served by apache
RewriteRule ^/static/(.*)$ /var/lib/tomcat5.5/webapps/myapp/static/$1 [L]
# everything else should go through tomcat
RewriteRule ^/(.*)$ /myapp/$1 [L,PT]

Когда я делал это с Apache 1 в прошлом, я должен был убедиться, mod_jk получить загружен раньше mod_rewrite, но я не могу достичь этого в Apache 2. Есть мысли? Как другие люди обычно делают это?

4 ответа

Решение

Удалось заставить это работать в конце. Похоже, что мне нужно установить JkOption для:


JkOptions     +ForwardURICompat

А потом mod_jk смотрит на переписанный URL. Должен признать, что не на 100% уверен, почему это работает, но я верю, что он возвращается к более старой форме поведения. Если бы кто-нибудь мог сказать мне лучший / более правильный способ сделать это, я хотел бы знать.

Может быть лучше использовать Apache для прокси вместо mod_jk. Что-то вроде этого:

ProxyPass / static / http://localhost:8080/myapp/static/

Может быть проще или прозрачнее, что произойдет, если вы используете виртуальные хосты Tomcat или разные коннекторы для разных хостов и просто развернете корневые приложения (в "/") и настроите переадресацию Apache mod_jk на разные коннекторы или виртуальные хосты.

Примечание: Когда мне это было нужно, я работал с разными коннекторами для разных хостов tomcat или двигателей (не помню) и развернул ROOT-приложения. Я никогда не пробовал виртуальные хосты (основанные на имени) в tomcat, только предполагая, что это может сработать.

Преимущество: нет перевода пути, поэтому намного легче понять, как только вы вносите изменения в установку через несколько месяцев после первоначального развертывания.

Признаюсь, это звучит несколько странно, но польза от читабельности очень важна для меня.

Мы используем флаг 'R' вместо 'PT':

RewriteRule ^/(.*)$ /myapp/$1 [L,R]

Изменить: я упустил момент, чтобы не изменять URL-адрес, который видит пользователь. Альтернативный способ сделать это:

JkMount /* worker1
JkUnmount /static/* worker1

Тогда вам не понадобится RewriteRule.

И в соответствии с Apache Tomcat Site новые настройки по умолчанию mod_jk несовместимы с mod_rewrite и вы должны использовать +ForwardURICompatUnparsed,

Другие вопросы по тегам