Удаление контекста Tomcat из URL для виртуального хоста (mod_jk, mod_rewrite) - PullRequest
6 голосов
/ 14 января 2010

У меня есть один экземпляр Tomcat, содержащий несколько веб-приложений, каждый из которых доступен через свой / Context. Tomcat находится за httpd (фактически Debian Apache2), настроенным с виртуальными хостами для обслуживания каждого приложения / контекста. Tomcat подключается с помощью mod_jk.

Это прекрасно работает, когда меня не волнует удаление контекста из URL: когда запрашивается корень виртуального домена, запрашиваемый перенаправляется на domain.com/Context.

Однако для одного приложения я делаю хочу удалить контекст. Я считаю, что это можно сделать с помощью mod_rewrite и передачи переписанного URL-адреса в mod_jk для передачи в правильный контекст Tomcat. Итак, мой файл, доступный для сайтов Debian Apache2, выглядит следующим образом:

NameVirtualHost *

<VirtualHost *>
    ServerName domain.be

    DocumentRoot /home/webapp/app/static/domain/

    RewriteEngine on
    RewriteRule ^/(.*)$ /Context/$1 [L,PT]
    RewriteLog "/var/log/apache2/domain-rewrite.log"
    RewriteLogLevel 4

    JkLogFile     /var/log/apache2/domain-mod_jk.log
    JkLogLevel    debug
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkMount /Context w1
    JKMount /Context* w1
    JkOptions +ForwardURICompat

    ErrorLog /var/log/apache2/domain_error.log
    CustomLog /var/log/apache2/domain_access.log combined
    LogLevel warn

</VirtualHost>

Согласно документам, параметры [PT] flag и + ForwardURICompat должны привести к тому, что переписанный URL будет передан jk_mod. Однако этого, похоже, не происходит.

URL переписывается, но кажется, что mod_jk его игнорирует: например, запрос для domain.be/Context переписывается как / Context / Context - но все же передается mod_jk как /Context.

Есть идеи? Кстати, сейчас я не могу использовать mod_proxy.

Спасибо

Ответы [ 5 ]

4 голосов
/ 15 декабря 2011

@ Джош, я думаю, что это решение не будет работать, если tomcat выполнит какие-либо перенаправления. Это типичный случай, например, в приложении, требующем входа в систему. Когда пользователь не аутентифицирован, приложение будет перенаправлено на что-то вроде / login, однако tomcat добавит текущий контекст, например, в / context / login, чтобы в конце контекст отображался в URL.

Как вы упомянули в своем другом вопросе / ответе, использование виртуальных хостов mod-jk плюс tomcat является опцией, но там вам нужно будет развернуть свои приложения как ROOT.war, что может быть не так просто. Существует обходной путь, поэтому ваше приложение может быть просто помещено в папку tomcat webapps, но, как я описал здесь , сервер развернет приложение по крайней мере дважды.

Было бы здорово, если бы RewriteRule [P] плюс JkOptions + ForwardURICompat мог работать, но это не так. Кстати, я проверил это, и я знаю, что mod_proxy работает, когда я перенаправил свой сайт на cnn.com, и я получил их страницу под URL моего сайта. Ниже приведены журналы BTW для запросов, в которых видно, что используется прокси:

127.0.0.1 - - [15/Dec/2011:12:56:34 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/
127.0.0.1 - - [15/Dec/2011:12:56:34 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/ [OK]
127.0.0.1 - - [15/Dec/2011:12:56:49 --0500] [localhost/sid#1008ef278][rid#1009aaca8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/login
127.0.0.1 - - [15/Dec/2011:12:56:49 --0500] [localhost/sid#1008ef278][rid#1009aaca8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/login [OK]
127.0.0.1 - - [15/Dec/2011:12:57:15 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/j_spring_security_check
127.0.0.1 - - [15/Dec/2011:12:57:15 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/j_spring_security_check [OK]
127.0.0.1 - - [15/Dec/2011:13:08:41 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (2) forcing proxy-throughput with http://localhost/nestorurquiza-app/
127.0.0.1 - - [15/Dec/2011:13:08:41 --0500] [localhost/sid#1008ef278][rid#1009980a8/initial] (1) go-ahead with proxy request proxy:http://localhost/nestorurquiza-app/ [OK]
2 голосов
/ 16 июня 2012

Я оставлю свой первоначальный ответ, но это неправильно. Правильный способ сделать это будет с Tomcat VirtualHost:

http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html

Официальный переход по ссылке выше - именно то, что я использовал несколько раз. Я не буду пытаться сварить это здесь.

Концепция такая же, как у Apache Vhost. Создайте виртуальный хост (например, для something.yourtdomain.com) и разверните веб-приложение в приложении ROOT (/) для этого виртуального хоста, и все готово. Таким образом, если у вас уже есть ROOT веб-приложение, вы можете иметь другое в другом домене, и предыдущий останется неизменным.

Как упомянул Нестор, правило переписывания Apache не будет обрабатывать такие вещи, как библиотеки тегов и фреймворки, которые автоматически создают для вас ссылки / действия в форме / и т.д. на основе корневого контекста. В этом случае они создадут правильный корневой контекст (/).

2 голосов
/ 08 февраля 2011

Я использую это с большим успехом:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(Context/.*)$
RewriteRule ^/(.*)$ /Context/$1 [P,L]

Замечания о вашей ситуации:

  • Вам нужно будет запустить mod_proxy, иначе [P] будет проигнорировано, и запрос будет перенаправлен вместо прокси. Обойти это невозможно.
  • +ForwardURICompat является частью mod_jk и вступит в силу после переписывания.
  • mod_jk игнорирует запрос, потому что он никогда не попадает туда. Вам нужно RewriteCond (выше), чтобы предотвратить перезапись запросов в / Context.

В настоящее время я ищу способ сделать это без mod_rewrite и использую вместо этого просто mod_jk и Tomcat s . Но у меня проблемы с хостами apache, mod_jk и Tomcat, которые хорошо играют вместе. Вышесказанное должно работать нормально для вас.

0 голосов
/ 04 марта 2018

Следуя подсказкам, данным в ответе Нестора Уркизы, мне удалось решить проблему, определив дополнительный хост в файле tomcat server.xml, потому что, как уже было сказано, на запрос j_security_check отвечает tomcat с инструкцией пересылки в браузер, которая неизбежно содержит имя контекстатак что пользователи, пытающиеся войти, получают 408 ошибок.Таким образом, реальное проникновение в директиву Apache VirtualHost JkMount /* worker1 достижимо путем назначения целевого контекста ROOT one.

Apache httpd.conf [и / или включенного * .conf] файла:

<!-- the subdomain -->

<VirtualHost *:80>
    ServerName appWelcome.example.org
    ServerAlias www.appWelcome.example.org
    JKMount /* worker1
</VirtualHost>

<!-- with mod_jk set up -->

LoadModule    jk_module modules/mod_jk.so
JWorkersFile  /etc/apache2/workers.properties
JkShmFile     /var/log/apache2/mod_jk.shm

Таким образом, чтобы сопоставить весь запрос, сделанный с субдоменом http://appWelcome.example.org/, непосредственно с контекстом tomcat in-charge / appWelcome, контекст appWelcome должен быть адресуемым с запросом на http://appWelcome.example.org:8080/

.Файл tomcat server.xml будет носить отдельный Host для приложения, которое вы хотите предоставить:.

<Server ...>
  <Service>
    <Engine defaultHost="localhost" ...>

      <Host name="appWelcome.example.org" appBase="appWelcomeBase" ... >
        <Valve ... />
      </Host>

      <Host name="localhost" appBase="webapps" ...>
        <!-- this Host is typically shipped with manager, host-manager, docs, 
          sample, examples and a default ROOT context that shows tomcat default home. -->
        <Valve ... />
      </Host>

    </Engine>
  </Service>
</Server>

Обратите внимание, что разрешения (и контекст selinux, если он включен) должны быть скорректированы, чтобы имитироватьпо умолчанию Host следующие:

$CATALINA_HOME/conf/Catalina/app.example.org как $CATALINA_HOME/conf/Catalina/localhost

$CATALINA_HOME/appWelcomeBase как $CATALINA_HOME/webapps

Откуда это все, что осталось сделатьэто проблема переименования и перемещения веб-архива appWelcome.war для его автоматического развертывания в созданном appBase (заменив $ CATALINA_HOME его значением, например / var / www / tomcat7):

# mv $CATALINA_HOME/webapps/appWelcome.war $CATALINA_HOME/appWelcomeBase/ROOT.war

Вуаля!

0 голосов
/ 24 сентября 2012

Используйте mod_proxy_ajp вместо mod_jk, как показано ниже:

<VirtualHost *:80>
  ServerName domain.be

  DocumentRoot /home/webapp/app/static/domain/

  ...

  ProxyPass /Context ajp://localhost:8009/Context
  ProxyPass / ajp://localhost:8009/Context/

  ...
</VirtualHost>
...