使用 undertow-handlers.conf 重写路径无法按预期工作

msa*_*ord 2 jboss7.x undertow angular-router

背景

带有 Angular 7 UI 的 JBoss 7.1.5 EAP 后端。

我需要让 JBoss 了解 UI 的路由,但将它们全部重写到 UI 的索引页,以便通过 Angular 进行路由。

该项目的结构如下:

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

  assets/*
  ...html
  ...js
  ...css
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

通过上述配置,我看到了预期的服务器日志:

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

我可以访问该网站的登录页面,并且 URI/按预期提供主要角度索引页面和资产。

问题

我需要的是这个上下文中的路径(例如/base/shop/60)由 Angular 处理,因此重定向到index.html。

作为基于这个答案的简单测试,我在以下位置尝试了这个单一规则WEB-INF/undertow-handlers.conf

exists(%{RELATIVE_PATH}) -> done
path-prefix('/') -> rewrite('/');
Run Code Online (Sandbox Code Playgroud)

但当我得到 404 时,它似乎什么也没做。

我已经尝试过了-> rewrite('/index.html'),但-> rewrite('/index.jsp')没有成功。

不过,该文件显然正在被读取,因为如果我将垃圾放入文件中,它会在服务器日志中引发异常。

UT000045: Error parsing predicated handler string Invalid expression:
# path('/base') -> rewrite('/')
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

我对 JBoss 和整个 Undertow 生态系统还是个新手;请让我知道我应该在这个问题中添加哪些其他细节。

好奇心

/激活请求转储程序后,我在启动后立即看到JBoss ( ) 发出的单个初始请求User-Agent=Java/1.8.0_181,但是当我从浏览器导航到 时/,我在转储中看不到该请求。但我确实看到了失败的请求/base。这是为什么?

小智 5

我正在从 /gui 提供 Angular 8 SPA(就像你一样,我的 API 位于另一个 servlet 中)。我对 Undertow 2.0.15 (EAP 7.2) 所要做的就是添加一个 WEB-INF/undertow-handlers.conf :

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

我猜如果您的 SPA 服务于 / 您可以:

not file(%U) -> rewrite('/index.html')
Run Code Online (Sandbox Code Playgroud)