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

StackOverflow https://stackoverflow.com/questions/208261

Вопрос

Итак, я хочу, чтобы веб-приложение, работающее в 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.Есть предположения?Как другие люди обычно это делают?

Это было полезно?

Решение

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


JkOptions     +ForwardURICompat

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

Другие советы

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

ПроксиПасс /статический/ 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 новые настройки по умолчанию mod_jk несовместимы с mod_rewrite и вам следует использовать +ForwardURICompatUnparsed.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top