【发布时间】:2019-04-19 23:45:28
【问题描述】:
背景
带有 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
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 处理,因此重定向到索引。
作为基于this answer的简单测试,我在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 的请求失败。这是为什么呢?
【问题讨论】:
标签: jboss7.x angular-router undertow