用 undertow-handlers.conf 重写路径没有按预期工作
Rewriting paths with undertow-handlers.conf doesn't work as expected
背景
JBoss 7.1.5 EAP 后端 Angular 7 UI.
我需要让 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 /
按预期提供主 angular 索引页面和资产。
问题
我需要的是由 Angular 处理此上下文中的路径(如 /base
或 /shop/60
),因此重定向到 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
的失败请求。这是为什么?
我有两个问题:
我缺少规则,我误解了 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 服务器在另一个 servlet 上下文中从 /RestService/
提供服务,因此不需要任何规则来允许它继续工作。
另外,我是通过ng hmr使用webpack的开发代理服务器,也需要添加相当于undertow规则的byPassProxy规则。
我很高兴对此进行改进:请不要犹豫发表评论或添加其他答案。
我正在从 /gui 提供一个 Angular 8 SPA(就像你一样,我的 API 在另一个 servlet 中)。我对 Undertow 2.0.15 (EAP 7.2) 所做的一切就是添加一个 WEB-INF/undertow-handlers.conf with:
path-prefix['gui'] and not file(%U) -> rewrite('/gui/index.html')
我猜想如果您的 SPA 在 / 提供服务,您可以:
not file(%U) -> rewrite('/index.html')
背景
JBoss 7.1.5 EAP 后端 Angular 7 UI.
我需要让 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 /
按预期提供主 angular 索引页面和资产。
问题
我需要的是由 Angular 处理此上下文中的路径(如 /base
或 /shop/60
),因此重定向到 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
的失败请求。这是为什么?
我有两个问题:
我缺少规则,我误解了 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 服务器在另一个 servlet 上下文中从 /RestService/
提供服务,因此不需要任何规则来允许它继续工作。
另外,我是通过ng hmr使用webpack的开发代理服务器,也需要添加相当于undertow规则的byPassProxy规则。
我很高兴对此进行改进:请不要犹豫发表评论或添加其他答案。
我正在从 /gui 提供一个 Angular 8 SPA(就像你一样,我的 API 在另一个 servlet 中)。我对 Undertow 2.0.15 (EAP 7.2) 所做的一切就是添加一个 WEB-INF/undertow-handlers.conf with:
path-prefix['gui'] and not file(%U) -> rewrite('/gui/index.html')
我猜想如果您的 SPA 在 / 提供服务,您可以:
not file(%U) -> rewrite('/index.html')