Переписывание URL-адресов tomcat 8

У меня есть два приложения tomcat, развернутые в двух разных контекстах:

someurl.com/context1/
someurl.com/context2/

Мне нужно перехватить URL-адреса в форме:

someurl.com/clientname/context1/ 

и перенаправить их на URL:

someurl.com/context1/clientname

где "имя клиента" является динамическим

Я попытался использовать клапан перезаписи в элементе моего файла tomcats server.xml, но он по-прежнему работает только для URL-адресов, которые включают контекст. то есть:

someurl.com/context1/clientname/context1 

переписывается на

someurl.com/context1/clientname

используя следующее регулярное выражение:

RewriteCond %{REQUEST_URI}  ^.*/context1/.*$

RewriteRule ^.*/context1/(.*)$  /context1/$1    [L]

Есть ли способ глобально переписать URL-адреса таким образом, чтобы контекст не учитывался?


person Radi Radichev    schedule 14.07.2015    source источник
comment
Ваша цель - избежать необходимости делать это в Java на уровне фильтра? Я предполагаю, что вы предпочитаете это как конфигурацию, а не файл class/jar правильно?   -  person Usman Mutawakil    schedule 19.07.2015
comment
Верный. Я действительно нашел решение, поэтому опубликую ответ чуть позже.   -  person Radi Radichev    schedule 20.07.2015
comment
Большое спасибо за ваш вопрос, ваше групповое регулярное выражение (с использованием $1) помогло мне изменить последнюю часть URL-адреса.   -  person Edenshaw    schedule 03.12.2019


Ответы (1)


После долгих поисков я нашел очень простой способ добиться желаемого результата. Хитрость заключается в том, чтобы настроить корневой контекст без развертывания там какого-либо фактического приложения. Затем к этому корневому контексту добавляется RewriteValve следующим образом:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="ROOT" path="/" reloadable="true" crossContext="true">
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve"/>
</Context>

Важно, чтобы для параметра crossContext было задано значение true, чтобы корневой контекст мог взаимодействовать с контекстами более низкого уровня.

Затем в WEB-INF корневого контекста следующий rewrite.config сделает свое дело:

RewriteRule ^/.*/context1/(.*)$     /context1/$1    [L]

что в основном означает: захватить все ur, которые имеют форму: clientname/context1/etc и направить их в context1/clientname/etc

person Radi Radichev    schedule 20.07.2015