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

Фон

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, поэтому они перенаправляются на index.

Как простой тест, основанный на этом ответе , я попробовал это единственное правило в 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 Ответ

0 голосов
/ 17 ноября 2018

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

Мне не хватало правил, и я неправильно понял функцию 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.

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

...