Как заставить 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
,