Я столкнулся с той же проблемой и попробовал ваше решение. Хотя это более или менее работало, было еще несколько глюков. И, честно говоря, это больше похоже на борьбу с симптомами, а не на излечение от болезни.
Итак, вот что наконец сработало для меня:
Вместо того, чтобы разделять развертывания по пути, я назначил каждое развертывание для своего собственного порта:
foo.war <-- http://localhost:8080/ -- | Proxy | <-- http://www.foo.com -- | Client |
bar.war <-- http://localhost:8181/ -- | Proxy | <-- http://www.bar.com -- | Client |
Таким образом, оба развертывания могут использовать / в качестве своего пути к контексту, поэтому нет необходимости редактировать путь к контексту.
Для этого вам не обязательно запускать два сервера приложений. В моем случае (Wildfly 10.0) было достаточно определить два сервера undertow в конфигурации wildfly, каждый со своим собственным виртуальным хостом и слушателем http, например, так:
<server name="foo-server">
<http-listener name="foo-listener" proxy-address-forwarding="true" socket-binding="foo-http"/>
<host name="foo-host" default-web-module="foo.war" alias="localhost, foo.com, wwww.foo.com"/>
</server>
<server name="bar-server">
<http-listener name="bar-listener" proxy-address-forwarding="true" socket-binding="bar-http"/>
<host name="bar-host" default-web-module="bar.war" alias="localhost, bar.com, wwww.bar.com"/>
</server>
<socket-binding name="foo-http" port="${jboss.http.port:8080}"/>
<socket-binding name="bar-http" port="${jboss.http.port:8181}"/>
Вам также понадобится jboss-web.xml в вашем проекте:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<server-instance>foo-server</server-instance>
<virtual-host>foo-host</virtual-host>
<context-root>/</context-root>
</jboss-web>
Два сервера необходимы, потому что вы не можете добавить привязку сокета к виртуальному хосту. Таким образом, здесь есть небольшие издержки, но они незначительны по сравнению с запуском двух полных серверов приложений.
Редактировать 1:
Мне только что пришло в голову, что, вероятно, даже нет необходимости использовать разные порты, и использование одного сервера undertow для каждого деплиомента, вероятно, также является излишним.
Поскольку прокси-сервер может перенаправлять хост по запросу клиента на сервер приложений, undertow должен иметь возможность выбрать правильный виртуальный хост с помощью параметра псевдонима.
Таким образом, в основном, прокси передает любой запрос на foo.com или bar.com на localhost: 8080 и позволяет AS разбираться с вещами.
Я не проверял это , но вот как это может работать (опять же, это для Wildfly 10.0):
<server name="default-server">
<http-listener name="http" proxy-address-forwarding="true" socket-binding="http"/>
<host name="foo-host" default-web-module="foo.war" alias="foo.com, wwww.foo.com"/>
<host name="bar-host" default-web-module="bar.war" alias="bar.com, wwww.bar.com"/>
</server>
И jboss-web.xml потеряет тег сервера:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<virtual-host>foo-host</virtual-host>
<context-root>/</context-root>
</jboss-web>
В случае, если это работает, не будет никаких накладных расходов.
Редактировать 2:
Только что протестировал упрощенный подход - да, он работает:)