Переписывание путей с помощью undertow-handlers.conf не работает должным образом

Фон

JBoss 7.1.5 EAP back-end с угловым интерфейсом 7.

Мне нужно, чтобы JBoss знал о маршрутах пользовательского интерфейса, но переписал их все на страницу индекса пользовательского интерфейса для маршрутизации по Angular.

Проект структурирован таким образом:

webapp/
  WEB-INF/
    undertow-handlers.conf
    web.xml
    ...etc
  login/
    background.jpg
  login.jsp
  index.jsp

  assets/*
  ...html
  ...js
  ...css

index.jsp просто response.sendRedirect("index.html")s, где index.html является частью активов, созданных Angular CLI. JavaScript и HTML подаются с webapp/, изображения из webapp/assets/,

конфигурация

От standalone-full.xml

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="http" socket-binding="http" redirect-socket="https"/>
        <host name="default-host" alias="localhost,workstation">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="request-dumper"/>
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config x-powered-by="false"/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        <filter name="request-dumper" module="io.undertow.core" class-name="io.undertow.server.handlers.RequestDumpingHandler"/>
    </filters>
</subsystem>

а также

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <virtual-server name="default-host">
        <alias name="localhost"/>
        <alias name="workstation"/>
    </virtual-server>
</subsystem>

С вышеупомянутой конфигурацией я вижу ожидаемый журнал сервера:

[org.wildfly.extension.undertow] (ServerService Thread Pool -- 84) WFLYUT0021: Registered web context: '/' for server 'default-server'

И я могу получить доступ к странице входа в систему сайта и URI / обслуживает главную угловую индексную страницу и ресурсы, как и ожидалось.

проблема

Что мне нужно для путей в этом контексте (например, /base или же /shop/60) должен обрабатываться Angular, поэтому перенаправляется на индекс.

В качестве простого теста, основанного на этом ответе, я попробовал это единственное правило в WEB-INF/undertow-handlers.conf:

exists(%{RELATIVE_PATH}) -> done
path-prefix('/') -> rewrite('/');

но, похоже, ничего не делает, так как я получаю 404.

я пробовал -> rewrite('/index.html') а также -> rewrite('/index.jsp') но безрезультатно.

Однако файл явно читается, потому что, если я помещаю мусор в файл, он вызывает исключение в журнале сервера.

UT000045: Error parsing predicated handler string Invalid expression:
# path('/base') -> rewrite('/')

Что я пропустил?

Я совершенно неофит для JBoss и всей экосистемы Undertow; пожалуйста, дайте мне знать, какие еще детали я должен добавить к этому вопросу.

Любопытство

С активированным дампером запросов я вижу один начальный запрос / сделано JBoss (User-Agent=Java/1.8.0_181) сразу после загрузки, но при переходе к / из браузера я не вижу этот запрос в дампе. Но я вижу неудавшийся запрос на /base, Это почему?

1 ответ

Решение

У меня было две проблемы:

Я пропустил правила, и я неправильно понял функцию path-prefix (который совпадает на полных и нетерминальных сегментах пути, а не действует как регулярное выражение ^(group)).

Мой финал, работа undertow-handlers.conf выглядит так:

regex('/login(.*)') -> done;

path-prefix('/assets') -> done;

regex('(.*).js') -> done;
regex('(.*).map') -> done;

regex('(.*).svg') -> done;
regex('(.*).png') -> done;

regex('(.*).eot') -> done;
regex('(.*).woff2') -> done;

regex('(.*).html') -> done;

path('/') -> rewrite('/index.html');

path('/base') -> rewrite('index.html');
path-prefix('/shop') -> rewrite('index.html');


...and all my other angular routes

Обратите внимание, что /base является конечным сегментом пути и соответствует path, в то время как /shop/60 принимает дополнительный параметр пути, поэтому требует path-prefex,

По какой-то причине решение, предложенное в связанном вопросе выше, просто фиксирует все это path-prefix('/') не работал в моем случае.

Возможно, очень полезное замечание: у нас есть REST-сервер, который обслуживает /RestService/ в другом контексте сервлета, поэтому не нужно было никаких правил, чтобы это продолжало работать.

Кроме того, я использовал прокси-сервер разработки webpack через ng hmr, и мне нужно было также добавить правила byPassProxy, эквивалентные правилам undertow.

Я рад за улучшения в этом: пожалуйста, не стесняйтесь комментировать или добавить другой ответ.

Я обслуживаю Angular 8 SPA из /gui (как и вы, мой API находится в другом сервлете). Все, что мне нужно было сделать с Undertow 2.0.15 (EAP 7.2), это добавить WEB-INF/undertow-handlers.conf с:

path-prefix['gui'] and not file(%U) -> rewrite('/gui/index.html')

Я предполагаю, что если ваш СПА обслуживается в /, вы можете просто:

not file(%U) -> rewrite('/index.html')
Другие вопросы по тегам